MATLABでplotの線を透明にしたい

MATLABで配列xyをプロットする時は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というファイルを入手できます。このデータを何も考えずにプロットすると下図のようになって見にくいです。

f:id:imakov:20211218152042j:plain

そこで、1時間ごとのデータは半透明にしつつ、1週間の移動平均をとったデータを重ね書きすると下のようになります。

f:id:imakov:20211218152120j:plain

このグラフを作るためのコードは以下のとおりです。

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)')