web-dev-qa-db-ja.com

異なる色のラインを自動的にプロット

同じグラフに複数のカーネル密度推定値をプロットしようとしていますが、それらをすべて異なる色にしたいです。文字列'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
107
Doresoom

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ドキュメンテーションの プロットの線の色の定義 を参照してください。

130
Azim

実際、色を循環させるための適切なショートカット方法は、hold all;の代わりにhold on;を使用することです。連続する各plotは、MATLABのデフォルトカラーマップを介して(自動的に)回転します。

hold のMATLABサイトから:

hold allは、プロットと現在の線の色と線のスタイルを保持し、後続のプロットコマンドがColorOrderおよびLineStyleOrderプロパティの値をリストの先頭にリセットしないようにします。プロットコマンドは、リスト内の最後のプロットが停止した場所から、事前定義された色と線種を繰り返し循環します。

106
Mark Elliot

遅い答えですが、2つの追加事項があります:

  • 'ColorOrder'プロパティを変更する方法、および'DefaultAxesColorOrder'を使用してグローバルなデフォルトを設定する方法については、この投稿の最後にある「付録」を参照してください。
  • 画像処理ツールボックスを使用する場合、MATLAB Central File Exchangeには視覚的に異なる色をいくつでも生成する優れたツールがあります。詳細をお読みください。

ColorOrderaxes property を使用すると、MATLABはhold on/allを使用するときに色のリストを自動的に循環できます(再び、setの方法については付録を参照してください/ get特定の軸のColorOrderまたはDefaultAxesColorOrderを介してグローバルに。ただし、デフォルトではMATLABは色の短いリストのみを指定します(just 7 R2013b以降)を繰り返すことで、より多くのデータ系列に適した色のセットを見つけることが問題になる可能性があります。 10プロットの場合、明らかにColorOrderに依存することはできません。

視覚的に異なるN個の色を定義するための優れた方法は、MATLAB Centralで "知覚的に異なる色を生成する"(GMPDC)を送信することです。ファイルファイル交換 。著者自身の言葉で最もよく説明されています:

この関数は "Lab"色空間 を参照することで区別できる色のセットを生成します。これは、RGBよりも人間の色知覚により密接に一致します。可能な色の最初の大きなリストが与えられると、以前に選択されたすべてのエントリから(Labスペースで)最も遠いリスト内のエントリを繰り返し選択します。

たとえば、25色が要求された場合:

25 "maximally perceptually-distinct colors"

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))
36
chappjc

パーティーに遅れて。私は自分でこれを調べていましたが、セッションまたは図の色の順序を指定し、配列をプロットしてMATLABに指定された色を自動的に循環させることができるColorOrderというこのAxesオプションについて見つけました。

デフォルトのColorOrderの変更 を参照してください

set(0,'DefaultAxesColorOrder',jet(5))
A=Rand(10,5);
plot(A);
12
xquared

すべてのベクトルのサイズが等しい場合、行列を作成してプロットします。各列は異なる色で自動的にプロットされます。その後、legendを使用して列を示すことができます。

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

または、カーネル名を持つセルがある場合は、使用します

legend(names)
4
Serg