我试图在同一张图上绘制几个核密度估计,并且我希望它们都是不同的颜色。我有一个使用字符串的拼凑解决方案 '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周不同的命名的colormaps( 'doc的颜色映射'列出他们全部)。

有不同颜色的绘制线另一种选择是使用 LineStyleOrder 属性;看到定义线条的颜色为MATLAB文档中绘制为更多的信息。

其他提示

实际上,用于获取颜色周期体面快捷方法是代替hold all;的使用hold on;。每个连续plot将通过MATLAB的默认颜色映射旋转(自动为您)。

这在MATLAB现场 hold

  

hold all持有的情节,以及电流线颜色和线型,以使后续绘图命令不重置ColorOrder和LineStyleOrder属性值到列表的开头。绘图命令继续通过从最后情节列表中停止的地方的预定义颜色和linestyles循环。

迟到的答案,但有两件事需要补充:

  • 有关如何更改的信息 'ColorOrder' 属性以及如何设置全局默认值 'DefaultAxesColorOrder', ,请参阅本文底部的“附录”。
  • MATLAB Central File Exchange 上有一个很棒的工具,可以生成任意数量的视觉上不同的颜色(如果您有图像处理工具箱可以使用它)。请继续阅读以了解详细信息。

ColorOrder axes 财产 允许 MATLAB 在使用时自动循环显示颜色列表 hold on/all (再次,请参阅下面的附录了解如何 set/getColorOrder 对于特定轴或全局通过 DefaultAxesColorOrder)。但是,默认情况下 MATLAB 仅指定一个简短的颜色列表(只有 7 自 R2013b) 循环遍历,另一方面,为更多数据系列找到一组好的颜色可能会出现问题。对于 10 个图,您显然不能依赖默认值 ColorOrder.

一个很好的方法 定义 N 种视觉上不同的颜色 是与 在 MATLAB Central File Exchange 上提交“生成最大感知不同颜色”(GMPDC). 。用作者自己的话说是最好的描述:

该函数生成一组颜色,可通过参考来区分 “实验室”色彩空间, ,比 RGB 更符合人类的色彩感知。给定一个可能颜色的初始大列表,它会迭代地选择列表中距所有先前选择的条目最远(在实验室空间中)的条目。

例如,当请求 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

流程简化了, 要求不 for 循环,与 ColorOrder 轴属性:

% X of size N-by-P-by-2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- 在此处设置颜色顺序 ---
plot(X(:,:,1),X(:,:,2),'-.')   % 不需要循环,不需要“颜色”。耶!

附录

为了得到 ColorOrder 用于当前轴的 RGB 数组,

get(gca,'ColorOrder')

获取默认值 ColorOrder 对于新轴,

get(0,'DefaultAxesColorOrder')

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

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

迟到了。我一直在寻找这个自己,才发现这个轴选项叫做ColorOrder 可以为会话或只是该图中指定的颜色顺序,然后只绘制的阵列,并让MATLAB通过颜色自动周期指定。

更改默认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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top