異なる色の線を自動的にプロットする


112

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

30
単に「すべてをホールド」してみましたか?これにより、新しいプロットコマンドごとにニュースの色が自動的に描画されます。
twerdster 2011

3
「すべてを保持」は実際の質問に対する回答ではありませんが、単に「保持」するだけですべての曲線が青で描かれるため、ここで終わる多くの人にとって解決策になる可能性があります。@twerdsterに感謝します!
レミ2013年

8
とおりR2014b、通常は、hold onある機能的に同等hold all。ただし、デフォルトの7色以上を取得する方法の問題は残っています。デフォルトのカラーマップは、Azimで説明されているソリューションであるか、以下のように、視覚的な識別が容易になるように調整された色を生成する関数を使用できます
chappjc 2014年

1
使用するhold allと、さまざまな色のプロットが得られますが(かなり鈍く見えるはずですが)、使用するとhold on、すべてのプロットが青になります。ですから、機能的同等性とは何なのかと思います。
HelloGoodbye 2015年

4
@HelloGoodbye R2014b以降でhold onは、さまざまなカラープロットが表示されます。古いバージョンを使用しています。現在のドキュメント、「hold allと同じですhold on注: この構文は、将来のリリースでは削除されます使用を。hold on代わりに。」リリースノートも参照してください。
chappjc 2015年

回答:


131

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


探していました。よろしくお願いします。
教授、

後世のために、@ Mark Elliotのhold allソリューションよりもこの回答を受け入れることにしました。これは、さまざまなカラーマップを選択できるというその多様性のためです。
Doresoom 2015年

plotの代わりに "line" plotコマンドを使用して動作させるにはどうすればよいですか?
Pedro77 2016年

106

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

上のMATLABサイトからhold

hold allプロットと現在の線の色と線のスタイルを保持するため、後続のプロットコマンドはColorOrderプロパティとLineStyleOrderプロパティの値をリストの先頭にリセットしません。プロットコマンドは、最後のプロットがリストで停止したところから、定義済みの色と線種を循環し続けます。


36

遅い答えですが、2つのことを追加します。

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

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

N個の視覚的に区別できる色定義する優れた方法は、MATLABセントラルファイルファイルエクスチェンジで「最大知覚的に異なる色を生成する」(GMPDC)サブミッションを使用することです。それは著者自身の言葉で最もよく説明されています:

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

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

25「最大の知覚的に明瞭な色」

GMPDCの提出は、MathWorksの公式ブログで2010年の「今週のおすすめ」として選ばれました(MATLABに組み込まれている7つのデフォルト色とは対照的に)任意の数の色を要求できるためです。彼らは、ColorOrder起動時にMATLABを設定して、

distinguishable_colors(20)

もちろん、ColorOrder1つの軸にを設定することも、色のリストを生成して好きなように使用することもできます。たとえば、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

プロセスは簡略化され、axisプロパティを使用してループを必要としませんforColorOrder

サイズN x P x 2の%X
mpdc10 = distinctable_colors(10)
ha =軸。hold(ha、 'on')
set(ha、 'ColorOrder'、mpdc10)%--- ここにColorOrderを設定 ---
plot(X(:、:、1)、X(:、:、2)、 '-。')%ループは不要、 'Color'は不要。わーい!

付録

ColorOrder現在の軸に使用されているRGB配列を取得するには、

get(gca,'ColorOrder')

ColorOrder新しい軸のデフォルトを取得するには、

get(0,'DefaultAxesColorOrder')

ColorOrderMATLABの起動時に10色で新しいグローバルを設定する例startup.m

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))

2
ただのメモですが、これには画像処理ツールボックスが必要なようです。
Doresoom 2015年

2
@Doresoom情報をありがとう。投稿を更新しました。
chappjc 2015年

12

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

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

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

1
1回限りの軸の場合:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev 2013

1
派手なツールボックスを必要としないjet(number)について通知するのに最適
crobar

4

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

data = randn(100, 5);

figure;
plot(data);

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

または、カーネル名のセルがある場合は、

legend(names)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.