自动绘制不同颜色的线条

113

我想在同一个图上绘制多个核密度估计,希望它们都是不同的颜色。我用了一个字符串'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
你尝试过直接使用“hold all”吗?这会自动为每个新的绘图命令设置新的颜色。 - twerdster
3
“hold all”并不是对实际问题的回答,但它可能是许多人在这里结束的解决方案,因为仅“等一下”会将所有曲线绘制成蓝色。非常感谢@twerdster! - Rémi
8
从R2014b版本开始,通常的hold on在功能上等同于hold all。但是,如何获得超过默认7种颜色的问题仍然存在。可以使用默认颜色映射作为解决方案,如Azim所述,也可以使用生成颜色函数来调整以便易于视觉区分,具体方法见以下链接:https://dev59.com/0HI-5IYBdhLWcg3wEEDu#22029354。 - chappjc
1
@HelloGoodbye hold on 仅仅是防止 MATLAB 在进行新的 plot 调用时擦除先前的绘图。而 hold all 则会为后续的 plot 调用分配新的属性。 - Doresoom
4
在R2014b及更高版本中,hold on会产生不同颜色的图形。您正在使用旧版本。根据当前文档,"hold all"与"hold on"相同。注意:此语法将在将来的版本中移除。请改用"hold on"。另请参阅发行说明 - chappjc
显示剩余3条评论
5个回答

132
您可以使用类似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
我该如何使用“line”绘图命令使其工作,而不是使用“plot”? - Pedro77

108
实际上,一个不错的快捷方法来实现颜色循环是使用hold all;代替hold on;。每个连续的plot将自动旋转通过MATLAB的默认colormap。
hold的MATLAB网站上可以看到:

hold all保持图形和当前线条颜色及线条样式,使得后续绘图命令不会重置ColorOrder和LineStyleOrder属性值到列表的开头。绘图命令继续在列表中从上一个绘图停止的地方循环预定义的颜色和线条样式。


38
晚回答了,但有两点需要补充:
  • 要了解如何更改'ColorOrder'属性并如何使用'DefaultAxesColorOrder'设置全局默认值,请参阅本文底部的“附录”。
  • 如果您有图像处理工具箱,则可以在 MATLAB 中央文件交换中找到一个很棒的工具,用于生成任意数量的视觉上不同的颜色。请继续阅读以获取详细信息。

ColorOrder axes 属性使 MATLAB 在使用 hold on/all 时自动循环显示一系列的颜色(再次参见下面的“附录”,了解如何通过 set/get 对特定轴或通过 DefaultAxesColorOrder 全局设置 ColorOrder)。然而,默认情况下MATLAB 只指定了一个短列表的颜色(截至 R2013b,只有 7 种)进行循环显示,另一方面,对于更多数据系列来说,找到一组好的颜色可能是有问题的。显然对于10个绘图,您不能依赖默认的ColorOrder

一个很好的方法是定义 N 种视觉上不同的颜色,使用 MATLAB 中央文件交换网站上的“生成视觉上最大程度区分颜色” (GMPDC) 工具。最好由作者自己来描述:

此函数生成一组颜色,这些颜色可以通过参考“Lab”颜色空间进行区分,该颜色空间比 RGB 更接近于人类的色彩感知。给定一份初始的可能颜色列表,它会迭代地选择与所有先前选择条目最远(在 Lab 空间中)的条目。

例如,当需要25种颜色时:

25 "maximally perceptually-distinct colors"

GMPDC 工具是 MathWorks 官方博客在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

иҝҷдёӘиҝҮзЁӢеҸҜд»Ҙз®ҖеҢ–пјҢдҪҝз”ЁColorOrderиҪҙеұһжҖ§иҖҢж— йңҖдҪҝз”ЁforеҫӘзҺҜпјҡ

% Xзҡ„еӨ§е°ҸдёәNГ—PГ—2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- еңЁжӯӨеӨ„и®ҫзҪ®ColorOrder ---
plot(X(:,:,1),X(:,:,2),'-.')   % ж— йңҖеҫӘзҺҜпјҢд№ҹдёҚйңҖиҰҒдҪҝз”ЁвҖңColorвҖқеұһжҖ§гҖӮеӨӘеҘҪдәҶ!

йҷ„еҪ•

иҰҒиҺ·еҸ–еҪ“еүҚиҪҙдҪҝз”Ёзҡ„ColorOrder RGBж•°з»„пјҢ

get(gca,'ColorOrder')

要获取新轴的默认 ColorOrder

get(0,'DefaultAxesColorOrder')

在 MATLAB 启动时,使用以下代码设置包含 10 种颜色的新全局 ColorOrder,在 startup.m 文件中实现:

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

13
晚来了。我自己也在研究这个问题,刚刚发现了一个叫做ColorOrder的轴选项,您可以为会话或仅为图形指定颜色顺序,然后只需绘制一个数组,让MATLAB自动循环遍历指定的颜色即可。
请参见更改默认的ColorOrder
示例
set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

1
对于单个轴:set(gca,'ColorOrder',jet(5)); - Evgeni Sergeev
1
非常好,只需通知关于不需要任何花哨的工具箱的Jet(数字)即可。 - crobar

5
如果所有向量的大小相等,则创建矩阵并绘制它。 每列自动以不同的颜色绘制 然后您可以使用legend指示列:
data = randn(100, 5);

figure;
plot(data);

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

或者,如果您有一个包含内核名称的单元格,请使用
legend(names)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接