在MATLAB中访问默认的LineStyleOrder和ColorOrder数组

时间:2013-07-23 18:54:12

标签: matlab matlab-figure

MATLAB用户的快速“便利”问题。我循环绘制一个绘图命令,每次都将不同的数据传递给它。数据碰巧是从函数调用生成的,函数调用在每次迭代时传递不同的参数值。要在同一轴上绘制所有内容,我使用“保持”功能。遗憾的是,这不会自动循环显示可用的ColorOrder和/或LineStyleOrder绘图参数,因此每个迭代时绘制的每条线都具有相同的样式。

for i=1:nLines
    [x_data y_data]=get_xy_data(param1(i),param2(i))
    plot(x_data,y_data)
end

每条线都是默认的蓝线样式。 显而易见的解决方案是预先生成各种线条样式的单元格数组,颜色如下:

line_styles={'-','--','-*'}; %...etc
colors=colormap(jet(nLines));

然后在每次迭代时访问每个。我想要的是访问将从ColorOrder生成的默认颜色,以及来自LineStyleOrder的默认行循环。如果我尝试这样的话:

get(gca,'LineStyleOrder')

这只返回在该轴中使用的样式(我只在使用其中一种样式定义的轴上测试了它,但是点是,它不会给我所有可能的线条样式)。帮助表示感谢,谢谢!

编辑:让我更具体地了解我正在寻找的东西。

figure; hold on;
for i=1:nLines
    [xdata, ydata]=get_data(p1(i),p2(i))  % call some function to return x,y data
    plot(xdata,ydata) % on i=1, default blue line

    % function which tells matlab to get/set the next linestyle, color combination          
    nextStyle()       
end

如果不存在,写它就不会太难,但我想在重新发明轮子之前先问一下。

3 个答案:

答案 0 :(得分:1)

您可以使用hold all。这会自动为每个情节设置不同的颜色和线条样式。

答案 1 :(得分:1)

您可以直接为每一行设置线条样式和颜色。这是一个例子:

figure
hold on
nLines = 12;

line_styles={'-','--','-.'};
colors= hsv(nLines);
indexColors = 1;
indexLines = 1;

for i=1:nLines
    xData = 1:10;
    yData = rand(1,10);
    h = plot(xData,yData);

    ls = line_styles{indexLines};
    c = colors(indexColors,:);

    set(h,'color',c)
    set(h,'LineStyle',ls)

    if indexColors < length(colors)
        indexColors = indexColors + 1;
    else
        indexColors = 1;
    end

    if indexLines < length(line_styles)
        indexLines = indexLines + 1;
    else
        indexLines = 1;
    end
end

答案 2 :(得分:1)

您可能有兴趣设置DefaultAxesLineStyleOrderDefaultAxesColorOrder的默认属性。

图(样式和颜色)将首先循环新定义的颜色,然后更改线条样式。在连续的绘图循环中,使用hold all将“保持图形和当前线条颜色和线条样式,以便后续绘图命令不会重置ColorOrder和LineStyleOrder”(请参阅​​matlab doc)。两个例子都产生相同的结果。

%default properties (line style and color)  
set(0,'DefaultAxesLineStyleOrder',{'--','-',':'})  
set(0,'DefaultAxesColorOrder', summer(4))  

figure('Color','w');  

%example plot 1 (concurrent plots)  
subplot(1,2,1);  
yvals = [1:50;1:50]  
plot(yvals, 'LineWidth', 2)  
axis([1 2 0 size(yvals,2)+1 ]);  
title('concurrent plot','FontSize',16);  

%example plot 2 (iterative plots)
subplot(1,2,2);  
for ii = 1:50  
    plot(yvals(:,ii), 'LineWidth', 2);  
    hold all;  
end  
axis([1 2 0 size(yvals,2)+1 ]);  
title('successive plot','FontSize',16);  

结果

enter image description here

看起来@Luis Mendo没那么错!