我有一些数据,名为X,大小为(100,2)。这个X由10个类别(每个类别包含10个元素)的数据组成。现在我想查看每个类别中的数据模式。为此,我需要为每个类别分配不同的颜色。我正在尝试使用循环而不是制作10个不同的图表。我尝试了以下代码。
hold on
for i=1:10:100
plot(X(i:i+9,1),X(i:i+9,2),'.')
end
hold off
这给了我一个相同颜色的图表。我如何为不同的范围分配不同的颜色?
hold all
的答案是正确和有用的,可以循环通过ColorOrder
axes
property 指定的颜色(尽管现在仅用hold on
等同于hold all
)。 但是,默认情况下,MATLAB仅指定一小组颜色(截至R2013b仅为7个),要循环显示更多数据系列时可能会遇到问题。对于10个图,您显然不能依赖默认的ColorOrder
,因此一个很好的方法是使用“生成最大感知差异颜色”(GMPDC),它提供了N种视觉上不同的颜色。 这个函数是作者自己的话:
例如,当请求25种颜色时,生成的颜色如下所示:该函数生成一组颜色,这些颜色可以通过参考“Lab”颜色空间来区分,该颜色空间比RGB更接近人类的视觉感知。 给定一个初始的可能颜色列表,它迭代地选择在列表中距离所有先前选择的条目最远(在Lab空间中)的条目。
ColorOrder
为:distinguishable_colors(20)
ColorOrder
,或者只是生成一个颜色列表以任何你喜欢的方式使用。例如,要生成10种“最大程度地感知差异化颜色”并在同一坐标轴上使用它们进行10个图形绘制(不使用ColorOrder
):% Starting with X of size 100x2
X = reshape(X,10,10,2); % for clarity, column is category, row is observation
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:10,
plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end
或者,使用 ColorOrder
轴属性可以简化该过程:
X = reshape(X,10,10,2); % for clarity, and to avoid loop
mpdc10 = distinguishable_colors(10) % 10x3 color map
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)
plot(X(:,:,1),X(:,:,2),'-.') % loop NOT needed, 'Color' NOT needed
附录
要获取当前轴使用的ColorOrder
RGB数组,
get(gca,'ColorOrder')
ColorOrder
,get(0,'DefaultAxesColorOrder')
在 MATLAB 启动时,在 startup.m
中设置新的全局 ColorOrder
,包含 10 种颜色的示例:
set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
hold on
替换为hold all
。plot
函数:linespec = {'b.', 'r-', 'g--o'}; % define your ten linespecs in a cell array
hold on
for i=1:10:100
plot(X(i:i+9,1),X(i:i+9,2),linespec{i})
end
hold off
hold on
保证新的 plot
命令添加到绘图中而不是替换它。然而,每个命令都像生成一个新的图一样工作,包括从第一条线颜色 (蓝色) 开始。如果您想要后续绘图使用不同的颜色,请改用 hold all
。这样标准的7种线条颜色就会依次使用。
由于您有10条线要绘制,您可能希望明确指定颜色以确保它们都不同。为此,请使用以下语法
plot(..., 'Color', [r g b])
ha = axes; hold(ha,'on')
的效果不佳。当在一个图中绘制多个图时,它会产生损坏的轴刻度。使用ha = gca;
则可以解决这个问题。 - Jonas Steinaxes
只是创建新的坐标轴,而gca
获取当前的坐标轴或者在没有打开的情况下创建新的坐标轴。所以如果它不再起作用了,那么值得向 MathWorks 报告。然而,我正在运行 R2016b,我没有观察到任何问题。你能否发布一个 gist 来重现问题?和/或者一张截图? - chappjc