plotmatrixで遊んでみる

MATLABのplotmatrixという関数があります。この関数は散布図行列を作成する関数です。下図にplotmatrixで可視化した図を示します。「これは便利!」と感じる反面「調整どうやったらいいんだ…」と悩む代表格のような可視化関数でした。今回plotmatrixで可視化した図の修正方法について色々試してみたので、その内容について記載できればと考えています。

最後はこんな風に改造できました

まず、plotmatrixのすごいところ


何点かあるかと考えますが、端的にいって「手軽・便利・安心」ということでしょうか。「Tiledlayoutやsubplotで一つ一つ描いて…」という操作でできなくもないですが、表示範囲を合せたりミスなく組むのは意外にハードルがあるので素直にうれしいですね。

  • 変数ごとの整合性を確認しなくていいこと
  • グラフ軸の分割を気にしなくていいこと。
  • 各グラフの表示範囲の整合性がとれていること
  • ToolBoxが不要

plotmatrixで困ったこと

「とりあえず可視化」では便利がいいのですが、正直にいうと「調整が難しい…」と感じます。そこで、なぜ難しいと感じたかを考えてみました。今の考えとしては、「戻り値の数と種類が多くて、確かめる行為が地味に大変」なのかなと考えています。なお、公式のドキュメントでは、plotmatrixで生成される戻り値の説明は次のようになっています。


引用:https://jp.mathworks.com/help/matlab/ref/plotmatrix.html

「36個の軸と36個のグラフデータだけではなかった?」plotmatrixの中身

例えば6変数のデータをplotmatrixで可視化した際、6×6の散布図行列が表示されます。この図を最初に眺めたとき、「36個の軸と36個のグラフデータ(散布図とヒストグラム)なんだろうな…」と思っていました。ですが、この考えは思い込みだったことがわかりました。

実際に、100行×6列のサンプルデータを用意してplotmatrixで可視化してみました。そして一つ一つの戻り値の中身を確かめてみました。その結果、次のようになりました。

軸の数:
 36(軸)+6(ヒストグラム軸)+1(大きな軸)

グラフデータの数:
 36(lineオブジェクト)+6(ヒストグラムオブジェクト)

この数を見たとき、数がちょっと多いな…と思いました。大きな軸はともかく、lineオブジェクトが36存在し、ヒストグラムオブジェクトが6個あるのか…と思いました。

plotmatrixの戻り値の中身

色々試した結果、現状で認識できた範囲のものを図示してみました。色々と確かめた結果、「個別の枠に該当するAXや散布図のオブジェクトS」の上に「ヒストグラムのオブジェクトであるHや軸のHAXのオブジェクト」が乗っかっているイメージで納得しています。

plotmatrixの修正

戻り値の中身がわかったので、それぞれのオブジェクトで少し修正してみます。修正内容は次のようにしました。個人的に「カラーバーも出せた」のはうれしいポイントでした。

  • S(散布図点):赤にする
  • AX(個別の軸):黄色で軸内をぬる
  • BigAx(大きな軸):カラーバーを表示する
  • H(ヒストグラム):表示を消す
  • HAx(ヒストグラムの軸):グレーにする

plotmatrixの改造で遊んでみる

plotmatrixで遊んでみました。勢いで作ったので、色々と怪しい部分もあるかと思います。あくまで、「見た目としてこんな調整ができるんだ」という範囲で、ご容赦いただければ幸いです。

あまり整理できていませんが、サンプルコードをブログ末に記載しています。もし、エクセルのサンプルデータが欲しいという方がいらっしゃれば、無料にてお渡しさせていただいていますので、メールやLINE、XのDMなどでご連絡いただければ幸いです。

※XのDMは相互フォローでない場合、DMが表示されないことがあります…

コンセプトです。

  • テーブルデータを使用する
  • テーブルの変数名を対角成分に表示する(その際ヒストグラムを消す)
  • 相関係数を計算する
  • 相関係数に応じて、行列の下三角領域の色を着色する(その際散布図を消す)
  • 相関係数の値がしきい値以上で強調させる
  • カラーバーを表示する
  • 上三角成分の散布図の色などを変更し、近似直線を挿入する
  • メモリラベルを削除する

SCISELでは、”MATLABやLabVIEWを使った研究・開発”のサポートや代行などを行っています。ご興味のある方はこちらまでご連絡いただければ幸いです。

clear;close all;clc

%% 読み取りと各種設定値

filename = 'Sample_Correlated_Data.xlsx';

Th = 0.5; % 蛍光色になる基準値


%% カラーマップを作成
% カラーマップのサイズ
nColors = 256;

% 3つの基準点(青 → 白 → 赤)
cx = [0, 0.5, 1];

c(1,:) = hex2rgb('#008BFB'); %マイナス側の色
c(2,:) = hex2rgb('#FFFFFF'); %中間色
c(3,:) = hex2rgb('#FF0051'); %プラス側の色


% 補間用の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'];
climValue = [-1 1];

%% テーブルデータの読み取りと変数名を参照
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));
% BigAx.PlotBoxAspectRatio=[3 3 3];
% タイトルを表示
title(BigAx,"Correlation and Scatter Plot Visualization of Variable Relationships",FontSize=24)

% カラーマップの設定
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];
            axh=HAx(1,i);
            ax = AX(i,j);
            text(axh, 0.5, 0.5,varName(i), ...
                'Units', 'normalized', ...
                'HorizontalAlignment', 'center', ...
                'VerticalAlignment', 'middle', ...
                'FontSize', 10, ...
                'Color', 'k',...
                'FontWeight', 'bold',...
                'Interpreter','none');  % 文字色(必要に応じて)
        end

        if i < j  % 上三角側の調整
            ax = AX(i,j);  % 対応する軸を取得
            axes(ax);  % 現在の軸に設定

            % x: 第j変数, y: 第i変数
            % x = table2array(Tbl(:,j));
            % y = table2array(Tbl(:,i));
            x = S(i,j).XData;
            y = S(i,j).YData;


            % 欠損値除去(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).MarkerSize=5;
            S(i,j).Marker="o";
            S(i,j).Color=[0.5 0.5 0.5];
            plot(x, yfit,'-', 'Color','k','LineWidth', 2.5);
            hold off;

        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', 18, ...
                    'Color', 'y',...
                    'FontWeight', 'bold',...
                    'Interpreter','none');
            else
                % 通常時のテキスト表示
                text(ax, 0.5, 0.5,viewValue, ...
                    'Units', 'normalized', ...
                    'HorizontalAlignment', 'center', ...
                    'VerticalAlignment', 'middle', ...
                    'FontSize', 10, ...
                    'Color', 'k',...
                    'FontWeight', 'normal',...
                    'Interpreter','none');

            end

            % 相関係数の値に応じて色を塗る
            AX(i,j).Color=CustomColormap(colorIndex(i,j), :);

        end

        % メモリラベルを消す
        xticklabels(ax,{})
        yticklabels(ax,{})
     
    end
end

% daspect(BigAx,[1 1 1])

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA