【问题标题】:Get access to the default LineStyleOrder and ColorOrder arrays in MATLAB访问 MATLAB 中的默认 LineStyleOrder 和 ColorOrder 数组
【发布时间】:2013-07-23 18:54:12
【问题描述】:

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

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

【问题讨论】:

    标签: matlab matlab-figure


    【解决方案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);  
    

    结果是

    看起来@Luis Mendo 并没有那么错!

    【讨论】:

    • 我知道当绘制一个向量时,它会自动循环遍历(现在修改的)LineStyleOrder 和 ColorOrder,我知道如何设置它们。但是,当使用hold 命令在后续迭代中绘制一行数据时,它不会自动循环。这是我的问题。
    • 也许我不明白。请看我编辑的帖子。我添加了第二个示例,在连续情节情况下使用全部保留。
    • 看起来可行!断开连接是您在使用上面提到的hold all 时需要手动设置DefaultLineStyleOrder。谢谢!如果可以的话,我会投票...
    • 谢谢你,@Magla!实际上,除了快速测试之外,我从未使用过hold all。我是在两天前才知道的:-)
    【解决方案2】:

    您可以使用hold all。这会自动为每个绘图设置不同的颜色和线型。

    【讨论】:

    • hold all 只设置颜色,不设置线条样式
    • 使用 ''hold all'' 似乎在 ColorOrder 中循环,但不是 LineStyleOrder。 ColorOrder 只有 7 种可能的颜色,所以这会导致重复。
    • 需要设置matlab的默认属性才能循环使用线条样式和颜色。 +1 @Luis Mendo
    【解决方案3】:

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

    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
    

    【讨论】:

    • 谢谢,这基本上就是我现在正在做的事情。我的问题是有没有办法让 MATLAB 知道我想循环到下一个颜色/线对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多