同じグラフに複数のカーネル密度推定値をプロットしようとしていますが、それらをすべて異なる色にしたいです。文字列'rgbcmyk'
を使用し、個別のプロットごとにステップスルーする賢明なソリューションがありますが、7回の反復後に重複し始めます。これを行う簡単で効率的な方法はありますか?
for n=1:10
source(n).data=normrnd(Rand()*100,abs(Rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
[f,x]=ksdensity(source(n).data); % calculate the distribution
plot(x,f,cstring(mod(n,7)+1)) % plot with a different color each time
end
HSVなどのカラーマップを使用して、色のセットを生成できます。例えば:
cc=hsv(12);
figure;
hold on;
for i=1:12
plot([0 1],[0 i],'color',cc(i,:));
end
MATLABには13種類の名前付きカラーマップがあります( 'doc colormap'はそれらすべてをリストします)。
異なる色で線をプロットする別のオプションは、LineStyleOrderプロパティを使用することです。詳細については、MATLABドキュメンテーションの プロットの線の色の定義 を参照してください。
実際、色を循環させるための適切なショートカット方法は、hold all;
の代わりにhold on;
を使用することです。連続する各plot
は、MATLABのデフォルトカラーマップを介して(自動的に)回転します。
hold
のMATLABサイトから:
hold all
は、プロットと現在の線の色と線のスタイルを保持し、後続のプロットコマンドがColorOrderおよびLineStyleOrderプロパティの値をリストの先頭にリセットしないようにします。プロットコマンドは、リスト内の最後のプロットが停止した場所から、事前定義された色と線種を繰り返し循環します。
遅い答えですが、2つの追加事項があります:
'ColorOrder'
プロパティを変更する方法、および'DefaultAxesColorOrder'
を使用してグローバルなデフォルトを設定する方法については、この投稿の最後にある「付録」を参照してください。ColorOrder
axes
property を使用すると、MATLABはhold on/all
を使用するときに色のリストを自動的に循環できます(再び、set
の方法については付録を参照してください/ get
特定の軸のColorOrder
またはDefaultAxesColorOrder
を介してグローバルに。ただし、デフォルトではMATLABは色の短いリストのみを指定します(just 7 R2013b以降)を繰り返すことで、より多くのデータ系列に適した色のセットを見つけることが問題になる可能性があります。 10プロットの場合、明らかにColorOrder
に依存することはできません。
視覚的に異なるN個の色を定義するための優れた方法は、MATLAB Centralで "知覚的に異なる色を生成する"(GMPDC)を送信することです。ファイルファイル交換 。著者自身の言葉で最もよく説明されています:
この関数は "Lab"色空間 を参照することで区別できる色のセットを生成します。これは、RGBよりも人間の色知覚により密接に一致します。可能な色の最初の大きなリストが与えられると、以前に選択されたすべてのエントリから(Labスペースで)最も遠いリスト内のエントリを繰り返し選択します。
たとえば、25色が要求された場合:
GMPDCの提出物は、MathWorksの公式ブログで Pick of the Week として2010年に選ばれました。これは、任意の数の色を要求できるためです(MATLABの7つのデフォルト色とは対照的)。彼らは、MATLABのColorOrder
を起動時に設定することを提案し、
distinguishable_colors(20)
もちろん、単一の軸にColorOrder
を設定したり、好きな方法で使用する色のリストを単に生成したりできます。たとえば、10個の「最大知覚的に異なる色」を生成し、それらを同じ軸の10プロットに使用するには(、ただしColorOrder
を使用せず、ループが必要です):
% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end
プロセスは単純化され、for
軸プロパティでColorOrder
ループを必要としません:
%XのサイズN行P列2 mpdc10 = distinctable_colors(10) ha =軸。 hold(ha、 'on') set(ha、 'ColorOrder'、mpdc10)%--- colorOrderの設定はこちら --- plot(X(:、:、1)、X(:、:、2)、 '-。')% ループは不要、「カラー」は不要。わーい!
付録
現在の軸に使用されるColorOrder
RGB配列を取得するには、
get(gca,'ColorOrder')
新しい軸のデフォルトColorOrder
を取得するには、
get(0,'DefaultAxesColorOrder')
startup.m
で、MATLAB起動時に10色の新しいグローバルColorOrder
を設定する例:
set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
パーティーに遅れて。私は自分でこれを調べていましたが、セッションまたは図の色の順序を指定し、配列をプロットしてMATLABに指定された色を自動的に循環させることができるColorOrderというこのAxesオプションについて見つけました。
デフォルトのColorOrderの変更 を参照してください
例
set(0,'DefaultAxesColorOrder',jet(5))
A=Rand(10,5);
plot(A);
すべてのベクトルのサイズが等しい場合、行列を作成してプロットします。各列は異なる色で自動的にプロットされます。その後、legend
を使用して列を示すことができます。
data = randn(100, 5);
figure;
plot(data);
legend(cellstr(num2str((1:size(data,2))')))
または、カーネル名を持つセルがある場合は、使用します
legend(names)