粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

MATLAB グラフの色をうまいこと調整する関数

MATLABのplot関数で作成した図の色にいつも困っているので関数作成。
デフォルトのr g b c m y などで決める色はいつも微妙に感じるのでそれらを変えてみようという試みです。

テスト用データ作成

これをプロットしていきます。

t = 0:0.01:3;
y = [sin(t);sin(t+0.1);sin(t+0.2);sin(t+0.3);sin(t+0.4);sin(t+0.5);sin(t+0.6);sin(t+0.7)];

Defaultカラー抽出

MATLABのデフォルトカラーはそこそこいい感じです。

https://jp.mathworks.com/matlabcentral/answers/160332-rgb-values-for-2014b-default-colors
次のコマンドでデフォルトカラーを確認できます。

get(groot,'DefaultAxesColorOrder')

先程のデータをプロットしましょう。
後ろの方は微妙ですが最初の4つくらいは普通に使える良い色合いだと思います。
RGB値は以下の通り。

         0    0.4470    0.7410    % 青
    0.8500    0.3250    0.0980 % 赤
    0.9290    0.6940    0.1250 % 山吹色
    0.4940    0.1840    0.5560 % 紫
    0.4660    0.6740    0.1880 % 緑
    0.3010    0.7450    0.9330 % シアン
    0.6350    0.0780    0.1840 % 茶色

どんな色がいいか?

さて,そのうちどのような色を用いればいいかですが,matlabの設定はまぁ悪くないかなぁと思っています。
青b,赤r,黄色y,後紫pは採用かなぁ。緑gはちょっと考えます。
f:id:ossyaritoori:20171202111501p:plain

あと,使えそうな色はオレンジoでしょうか。

どんな色がいいかとかは論文が幾つかありますがこんなの読んでいる場合じゃねぇ。
http://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf

色変更

plotする時にRGBで色を指定するには以下のように書けばよいですが,正直言ってこんなの絶対書きたくない。

plot(t,y,'Color',[1., 0.5, 0.])

一方で,Figureハンドルを入手していれば次のように代入形式で後付けで色を変更できます。
自動化が出来そうな兆しが見えてきましたね。

fig=plot(t,y)
fig(5).Color = [0,0.7,0]
fig(6).Color = [1., 0.5, 0.]

これで緑を強めにしてオレンジを追加しました。
f:id:ossyaritoori:20171202112555p:plain

後は関数化するだけや。
http://oxon.hatenablog.com/entries/2010/11/19

自動色つけ関数

仕様:グラフハンドルと色ハンドルを同時に渡してその色に対応するようにグラフを変えるsetfigcolor()関数を作成。

 setfigcolor(fig,'gbryo')

このように入れたい色を十番通り文字で指定すれば次のように変更可能ということ
f:id:ossyaritoori:20171202115439p:plain

なお,2つ目の色指定を全くしなければ関数内部で自動設定したデフォルトの色になります。

関数本体

function setfigcolor(hfig,colors,presetcolor)
glen = size(hfig,1);
colorcode = ['b';'r';'y';'p';'g';'o';'c';'k'];

if nargin == 2
    presetcolor =  [0    0.4470    0.7410;    % 青
    0.8500    0.3250    0.0980; % 赤
    0.9290    0.6940    0.1250; % 山吹色
    0.4940    0.1840    0.5560; % 紫
    0.4660    0.6740    0.1880; % 緑
    1.            0.5,         0.        ; % Orange
    0.6350    0.0780    0.1840; % chacole
    0             0             0]; %black
elseif nargin == 1
    presetcolor =  [0    0.4470    0.7410;    % 青
    0.8500    0.3250    0.0980; % 赤
    0.9290    0.6940    0.1250; % 山吹色
    0.4940    0.1840    0.5560; % 紫
    0.4660    0.6740    0.1880; % 緑
    1.            0.5,         0.        ; % Orange
    0.6350    0.0780    0.1840; % chacole
    0             0             0]; %black    
    colors = colorcode';
end
len=length(colors);


% set colors
for i=1:min(glen,len)
    n = find(colorcode==  colors(i));
    hfig(i).Color = presetcolor(n,:);
end

end