自动绘制不同颜色的线条

Dor*_*oom 109 matlab plot matlab-figure

我试图在同一个图上绘制几个核密度估计,我希望它们都是不同的颜色.我有一个使用字符串的kludged解决方案,'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
Run Code Online (Sandbox Code Playgroud)

Azi*_*zim 130

您可以使用HSV等颜色图来生成一组颜色.例如:

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end
Run Code Online (Sandbox Code Playgroud)

MATLAB有13种不同的命名颜色图('doc colormap'列出所有颜色图).

绘制不同颜色的线条的另一个选择是使用LineStyleOrder属性; 有关详细信息,请参阅MATLAB文档中的定义绘图线的颜色.


Mar*_*iot 106

实际上,用于获取颜色循环的一种合适的快捷方法是用来hold all;代替hold on;.每个连续plot将通过MATLAB的默认色彩图旋转(自动为您).

从MATLAB网站上hold:

hold all保存绘图和当前行颜色和线条样式,以便后续绘图命令不会将ColorOrder和LineStyleOrder属性值重置为列表的开头.绘图命令继续循环通过预定义的颜色和线条样式,最后一个绘图在列表中停止.

  • `hold all`将被弃用.`hold on`将保留其功能.... (5认同)

cha*_*pjc 36

迟到的答案,但要添加两件事:

  • 有关如何更改'ColorOrder'属性以及如何设置全局默认值的信息'DefaultAxesColorOrder',请参阅本文底部的"附录".
  • 如果您有图像处理工具箱使用它,MATLAB中央文件交换机上有一个很棒的工具可以生成任意数量的视觉上不同的颜色.继续阅读以了解详情.

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年的Pick of the Week,部分原因是它能够请求任意数量的颜色(与MATLAB内置的7种默认颜色形成对比).他们甚至提出了ColorOrder在启动时设置MATLAB的优秀建议,

distinguishable_colors(20)
Run Code Online (Sandbox Code Playgroud)

当然,您可以设置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
Run Code Online (Sandbox Code Playgroud)

使用axis属性简化了过程,不需要for循环ColorOrder:

% X of size N-by-P-by-2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- set ColorOrder HERE ---
plot(X(:,:,1),X(:,:,2),'-.')   % loop NOT needed, 'Color' NOT needed. Yay!

附录

要获取ColorOrder用于当前轴的RGB数组,

get(gca,'ColorOrder')
Run Code Online (Sandbox Code Playgroud)

要获取ColorOrder新轴的默认值,

get(0,'DefaultAxesColorOrder')
Run Code Online (Sandbox Code Playgroud)

ColorOrder在MATLAB 上设置10种颜色的新全局的示例,在startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
Run Code Online (Sandbox Code Playgroud)

  • 仅需注意,这似乎需要“图像处理工具箱”。 (2认同)
  • @Doresoom感谢您的信息。我更新了帖子。 (2认同)

小智 12

迟到了.我自己正在研究这个,并且刚刚发现了这个名为ColorOrder的轴选项,您可以指定会话的颜色顺序或仅为图形,然后只绘制一个数组,让MATLAB自动循环指定的颜色.

请参阅更改默认ColorOrder

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
Run Code Online (Sandbox Code Playgroud)


Ser*_*erg 5

如果所有向量的大小相同,则创建一个矩阵并绘制它。每列都自动用不同的颜色绘制然后您可以使用legend来指示列:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))
Run Code Online (Sandbox Code Playgroud)

或者,如果您有一个带有内核名称的单元格,请使用

legend(names)
Run Code Online (Sandbox Code Playgroud)