在for循环中调用时,我一直在尝试在Matlab中改变行属性。事实证明ColorOrder
和LineStyleOrder
这样的自动系统毫无用处,因为它们不会同时进行索引。我需要更改每一行的颜色和标记/线条样式。我找到了最好的解决方案:
hold on;
col = hsv(5);
mar = ['d','o','s','^','v','<','>'];
beta = [1,2,3,4,5];
for m = 1:length(beta)
b = beta(m);
y=[];
s = 0:05:8;
for m = s
y = [y integral(@(f)fun(m,b,f),0.0001,1000)];
end
plot(s,y./y(1),'Marker',mar(m),'color',col(m,:),'DisplayName',num2str(b))
legend('-DynamicLegend'); %automatically generate legend
end
hold off;
为了获得颜色和标记的迭代器,我被迫在beta的长度上循环而不是beta本身。但是,尽管这与文档中描述的完全相同,但颜色和标记都没有变化。我怀疑有一些奇怪的互动,但我无法弄清楚它是什么。有谁知道为什么这不会导致不同颜色和不同线条的标记?
答案 0 :(得分:2)
我在某处看到,在早期版本的Matlab中,我们无法在调用plot
期间同时更改这两个属性...我希望我有参考。我正在使用R2013a,它无论如何都无法正常工作。
作为一种变通方法,您可以为各个绘图指定一个句柄,并在绘图完成后同时更改两个属性。
换句话说,使用类似的东西:
hPlot = plot(...)
set(hPlot,'Marker',...,'Color',...,'LineStyle',...)
使用您的代码,看起来像这样:
clear
clc
close all
hold on;
col = hsv(5);
mar = {'d','o','s','^','v'};
%// ======== NEW ========\\%
linestyles = {'-' '--' ':' '-.' '-'}
beta = [1,2,3,4,5];
%// Dummy function
fun = @(x,y,z) x.*y-z;
for m = 1:length(beta)
b = beta(m);
y=[];
s = 0:05:8;
for m = s
y = [y integral(@(f)fun(m,b,f),0.0001,1000)];
end
%// ======== NEW ========\\%
hPlot(b) = plot(s,y./y(1));
set(hPlot(b),'Marker',mar{b},'color',col(b,:),'LineStyle',linestyles{b},'DisplayName',num2str(b))
legend('-DynamicLegend'); %automatically generate legend
end
hold off;
使用以下输出: