MATLABでplotの線を透明にしたい
MATLABで配列x
とy
をプロットする時はplot(x,y)
ですよね。plot
のオプションを指定する時は、 Name,Value の引数ペアをコンマ区切りで加えていきます。例えば、点線で線の太さを2ポイントにしたければ、plot(x, y, ’LineStyle', ':', 'LineWidth', 2)
です。
plot
の線を透明化するときは、この手法は使えません。plot
関数はchart line オブジェクトとよばれるオブジェクトを出力することができるので、そのオブジェクトを使って線を透明化します。例えば、次のようにやると透過度が0.2の線(0で透明、1で非透明)となります。
p=plot(x, y); p.Color(4)=0.2;
ちなみに、p.Color(1:3)
にはRGBの3成分の値が格納されています。
別のやり方
chart lineオブジェクトを使わなくても実はできる。赤い線で半透明な線を引きたければ次のようにする。
plot(x, y, 'Color', [1, 0, 0, 0.2]);
ただ、このやり方はこちらが色のRGB値を指定しないので、自分としては煩わしいやり方です。特に複数の線をプロットするときに、色を自分で指定するのは煩わしいので、色は自動でプロットさせといて、プロット後にchart lineオブジェクトを使って透明化しています。
例
2021年1月1日から2021年12月17日までの水戸市の気温データをプロットしてみます。データは気象庁のホームページからダウンロードします。「過去の地点気象データ・ダウンロード」から、データの種類を「時間別」、項目を「気温」としてデータをダウンロードすると、data.csv
というファイルを入手できます。このデータを何も考えずにプロットすると下図のようになって見にくいです。
そこで、1時間ごとのデータは半透明にしつつ、1週間の移動平均をとったデータを重ね書きすると下のようになります。
このグラフを作るためのコードは以下のとおりです。
clear variables close all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% filename = './data.csv'; HEADER_LINES = 5; DELIMITER = ','; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %+++ファイルの行数を調べる+++ fid = fopen(filename); alldata={}; while ~feof(fid) thisline = fgetl(fid); if ~ischar(thisline); break; end alldata{end+1,1} = thisline; end nol=numel(alldata); % nol = number of line fclose(fid); %+++データの数を決定し、配列を用意する+++ data_num = nol - HEADER_LINES; time_string = cell(1,data_num); T_deg = zeros(1, data_num); %+++データを配列に格納する for i=1:data_num newStr = split(alldata{HEADER_LINES+i}, DELIMITER); time_string{i} = newStr{1}; T_deg(i) = str2double(newStr{2}); end %+++データをtimeseries オブジェクトにする ts = timeseries(T_deg, time_string, 'Name', 'temperature (deg)'); ts.TimeInfo.Format = 'mmmdd'; %+++移動平均データの算出して、timeseries オブジェクトにする windowSize = 24*7; %元のデータが1時間毎のデータなので、これで1週間の平均 b = (1/windowSize)*ones(1,windowSize); a = 1; ts_ave = timeseries( filter(b,a,T_deg), time_string, 'Name', 'averaged temperature (deg)'); ts_ave.TimeInfo.Format = 'mmmdd'; %+++描画 p=plot(ts); p.Color(4) = 0.2; hold all plot(ts_ave, 'color', p.Color(1:3)); ylabel('Temperature (deg)')