MATLABのplotmatrixという関数がありますが、toolboxを購入することなく使えて、散布図行列を描写することができるのでデータの可視化に非常に便利だと感じています。今回は、plotmatrixで出力したFigureにどこまで加筆修正できるのか気になったので、少し遊んでみました。

plotmatrix(X) % 散布図行列をプロットする例。
実践したいこと
実践したいこととしては以下の点です。
- 上三角部分に近似した直線を重ねてプロットする
- 下三角成分に相関係数などの数値をプロットする
- 数値のプロットは、しきい値に応じて色などを変える
- 対角成分は、変数名にする
- 数値に応じて各軸の色を塗りつぶす
- 各軸の塗りつぶしに応じて、カラーバーを表示する
実践した結果やコードなど
詳細な検討内容については後日まとめさせていただければと思いますが、以下のようなグラフをプロットすることができました。今回はとりあえず、plotmatrixのデータを触っていくことをメインとしました。コードを張り付けていますが、表現方法やコードに含まれているプロセスの厳密性などについては参考程度としていただければと思います。

clear;close all;clc
filename = 'Sample_Correlated_Data.xlsx';
Th = 0.5; % 蛍光色になる基準値
climValue = [-1 1]; %色調範囲
%%
% カラーマップのサイズ
nColors = 256;
% 3つの基準点(青 → 白 → 赤)
cx = [0, 0.5, 1];
c = [0 0 1; % 青
1 1 1; % 白
1 0 0]; % 赤
% 補間用のx座標
xq = linspace(0,1,nColors);
% 各色成分をinterp1で補間
r = interp1(cx, c(:,1), xq);
g = interp1(cx, c(:,2), xq);
b = interp1(cx, c(:,3), xq);
% カラーマップを結合
CustomColormap = [r' g' b'];
%% テーブルデータの読み取りと変数名を参照
Tbl=readtable(filename);
varName=Tbl.Properties.VariableNames;
%% 相関行列の計算と可視化
R = corrcoef(table2array(Tbl));
data=tril(R);
Idx=abs(data) > Th;
%% カラーインデックスの計算
dataValue = R;
% 正規化して 1〜256 のインデックスに変換
nColors = size(CustomColormap, 1);
normalizedValue = (dataValue - climValue(1)) / (climValue(2) - climValue(1));
normalizedValue = min(max(normalizedValue, 0), 1); % 0〜1 にクリップ
% インデックス取得(1〜nColors)
colorIndex = round(1 + (nColors - 1) * normalizedValue);
%% 散布図行列
figure
[S,AX,BigAx,H,HAx] = plotmatrix(table2array(Tbl));
colormap(BigAx,CustomColormap);
clim(BigAx,[climValue(1) climValue(2)])
colorbar(BigAx)
% 散布図の数(列数)
n = width(Tbl);
% 各散布図に対して線形近似を追加
for i = 1:n
for j = 1:n
if i==j % 対角成分の調整
H(1,i).Visible="off";
HAx(1,i).Color=[0.8 0.8 0.8];
ax=HAx(1,i);
text(ax, 0.5, 0.5,varName(i), ...
'Units', 'normalized', ...
'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'middle', ...
'FontSize', 10, ...
'Color', 'k',...
'FontWeight', 'bold',...
'Interpreter','none'); % 文字色(必要に応じて)
end
if i>j % 下三角側の調整
S(i,j).Visible = "off";
viewValue=sprintf('%.2f',dataValue(i,j));
ax=AX(i,j);
if Idx(i,j)==1
text(ax, 0.5, 0.5,viewValue, ...
'Units', 'normalized', ...
'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'middle', ...
'FontSize', 10, ...
'Color', 'y',...
'FontWeight', 'bold',...
'Interpreter','none');
end
end
if i < j % 上三角側の調整
ax = AX(i,j); % 対応する軸を取得
axes(ax); % 現在の軸に設定
% x: 第j変数, y: 第i変数
x = table2array(Tbl(:,j));
y = table2array(Tbl(:,i));
% 欠損値除去(NaNがある場合)
valid = ~(isnan(x) | isnan(y));
x = x(valid);
y = y(valid);
% 線形近似(1次)
p = polyfit(x, y, 1);
yfit = polyval(p, x);
% 回帰直線を重ねる
hold on;
S(i,j).Color='k';
plot(x, yfit,'-', 'Color',[0.5 0.5 0.5],'LineWidth', 2.5);
hold off;
end
AX(i,j).Color=CustomColormap(colorIndex(i,j), :);
end
end
素直にtiledlayoutを使う場合と比べて楽そうに思ったこと
今回plotmatrixを使って、楽そうだな…と思ったことがいくつかあります。その中でも、次の2つの点は非常に便利だと感じました。
- 散布図の表示範囲を個別設定せずに再現が取れていること
- カラーバーも素直に横に配置できること
一方で難しいな…と思ったことは「plotmatrixの出力をどうやって触ろうか…」です。このあたりは公式のドキュメントを見ながら…実際に修正して触りながら…というところでアタリをつけていきました。コードとともにこのあたりを整理して、後日ブログやnoteなどに公開できればと思っています。
「MATLAB LabVIEWで困った…」をzoomやチャット作業代行でオンラインサポートしています。
ご興味のある方は → こちらまで