【问题标题】:Automatically plot different colored lines自动绘制不同颜色的线条
【发布时间】:2011-01-02 23:36:20
【问题描述】:

我试图在同一张图上绘制几个核密度估计值,我希望它们都是不同的颜色。我有一个使用字符串'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

【问题讨论】:

  • 您是否尝试过简单地“持有所有”?这会自动为每个新的绘图命令绘制新闻颜色。
  • "hold all" 不是对实际问题的回答,但可能是许多人在这里结束的解决方案,因为仅仅“hold on”会将所有曲线绘制为蓝色。非常感谢@twerdster!
  • R2014b 开始,通常的 hold on 在功能上等同于 hold all。但是,如何获得超过 7 种默认颜色的问题仍然存在。默认颜色图可能是 Azim 所描述的解决方案,或者可以使用生成颜色调整以便于视觉辨别的函数,as below
  • 当我使用hold all 时,我得到了不同颜色的图(尽管我必须说它们看起来很暗淡),而当我使用hold on 时,我所有的图都变成了蓝色。所以我想知道什么是功能等价。
  • @HelloGoodbye 在 R2014b 和更新版本中,hold on 提供不同的颜色图。您正在使用旧版本。来自the current docs,“hold allhold on 相同。注意:此语法将在以后的版本中删除。请改用hold on。”另见the release notes

标签: matlab plot matlab-figure


【解决方案1】:

迟到的答案,但要补充两点:

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

ColorOrder axes property 允许 MATLAB 在使用 hold on/all 时自动循环显示颜色列表(同样,请参阅下面的附录,了解如何使用 set/get ColorOrder 用于特定轴或全局通过 @ 987654334@)。然而,默认情况下 MATLAB 只指定一个简短的颜色列表(从 R2013b 开始只有 7 个 循环,另一方面,找到一个好的颜色可能会有问题更多数据系列的颜色集。对于 10 个地块,你显然不能依赖默认的 ColorOrder

定义 N 种视觉上不同的颜色的好方法是使用"Generate Maximally Perceptually-Distinct Colors" (GMPDC) submission on the MATLAB Central File File Exchange。最好用作者自己的话来描述:

此函数生成一组可通过引用 "Lab" color space 进行区分的颜色,这比 RGB 更接近人类的颜色感知。给定一个可能的颜色的初始大列表,它会迭代地选择列表中距离所有先前选择的条目最远(在实验室空间中)的条目。

例如,当请求 25 种颜色时:

GMPDC 提交在 2010 年在 MathWorks 的官方博客上被选为 Pick of the Week,部分原因是能够请求任意数量的颜色(与 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 = 可区分颜色(10) ha = 轴;保持(哈,'开') set(ha,'ColorOrder',mpdc10) % --- 在此处设置 ColorOrder --- plot(X(:,:,1),X(:,:,2),'-.') % 不需要循环,不需要'颜色'。耶!

附录

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

get(gca,'ColorOrder')

要获取新坐标区的默认 ColorOrder

get(0,'DefaultAxesColorOrder')

在 MATLAB 启动时使用 10 种颜色设置新全局 ColorOrder 的示例,在 startup.m 中:

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

【讨论】:

  • 请注意,这似乎需要图像处理工具箱。
  • @Doresoom 感谢您的信息。我已经更新了帖子。
【解决方案2】:

实际上,让颜色循环的一个不错的快捷方法是使用hold all; 代替hold on;。每个连续的plot 将通过 MATLAB 的默认颜色图(自动为您旋转)。

来自hold 上的 MATLAB 网站:

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

【讨论】:

    【解决方案3】:

    您可以使用 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 文档中的 Defining the Color of Lines for Plotting

    【讨论】:

    • 正在寻找它。很好@Azim。
    • 为了子孙后代,我选择接受这个答案而不是@Mark Elliot 的hold all 解决方案,因为它能够选择不同的颜色图的多功能性。
    • 如何使用“line”绘图命令而不是绘图使其工作?
    【解决方案4】:

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

    Changing the Default ColorOrder

    例子

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

    【讨论】:

    • 对于单轴:set(gca,'ColorOrder',jet(5));
    • 非常适合告知不需要任何花哨工具箱的 jet(number)
    【解决方案5】:

    如果所有向量的大小相同,则创建一个矩阵并绘制它。 每列自动绘制不同的颜色 那么就可以用legend来表示列了:

    data = randn(100, 5);
    
    figure;
    plot(data);
    
    legend(cellstr(num2str((1:size(data,2))')))
    

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

    legend(names)
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2019-10-02
      相关资源
      最近更新 更多