【问题标题】:MATLAB: set line's color and style order to be applied in parallelMATLAB:设置要并行应用的线条颜色和样式顺序
【发布时间】:2020-01-14 12:50:03
【问题描述】:

当您设置DefaultAxesColorOrderDefaultAxesLineStyleOrder 时,MATLAB 将首先循环使用第一种样式的所有颜色,然后再次使用第二种样式遍历所有颜色,依此类推。

请参阅此documentationrelated question

我想做的是设置独立应用的颜色顺序和样式顺序。

例如,如果我将DefaultAxesColorOrder 设置为[1 0 0; 0 1 0; 0 0 1] 并将DefaultAxesLineStyleOrder 设置为'-|--|:',则这些行将是'r-','g-','b-','r--','g--',@ 987654334@,'r:','g:','b:'。我希望行是'r-','g--','b:'

【问题讨论】:

    标签: matlab colors plot line linestyle


    【解决方案1】:

    Amro 的方法效果很好。请注意,您不必设置默认值来执行此操作。你可以这样做

    col = mycolors(); % defines RGB colors scaled to [0,1]
    
    i = 1;
    c(:,i) = col.royal_blue; i = i+1;
    c(:,i) = col.crimson; i = i+1;
    c(:,i) = col.medium_sea_green; i = i+1;
    c(:,i) = col.coral; i = i+1;
    c(:,i) = col.dark_magenta; i = i+1;
    
    colord = num2cell(c',2);
    lineord = {'-' '--' '-.'}'; 
    
    set(h,{'Color'}, colord(rem((1:numel(h))-1,numel(colord))+1), ...
          {'LineStyle'}, lineord(rem((1:numel(h))-1,numel(lineord))+1))
    set(h,'LineWidth',2)
    

    编辑:mycolors() 函数是自制的。我定义了

    colors.maroon = [128,0,0];
    colors.dark_red = [139,0,0];
    colors.brown = [165,42,42];
    ...
    

    (颜色名称来自此http://www.rapidtables.com/web/color/RGB_Color.htm)。然后我通过

    将它们缩放到[0,1]
    c = fieldnames(colors);
    for i = 1:numel(c)
        colors.(c{i}) = colors.(c{i})/255;
    end
    

    【讨论】:

    • 谢谢。什么是 mycolors 功能?我在 MATLAB 或 FileExchange 中都没有找到它。是你自己的代码吗?
    【解决方案2】:

    我没有看到直接开箱即用的方法。直接的方法是为每一行手动设置颜色/样式。

    这是一个更自动化的解决方案。让我们从文档中的一个示例开始:

    %# defaults are set sometime before
    set(0, 'DefaultAxesColorOrder',[1 0 0;0 1 0;0 0 1], ...
          'DefaultAxesLineStyleOrder','-|--|:')
    
    %# do plotting as usual
    t = 0:pi/20:2*pi;
    a = zeros(length(t),9);
    for i = 1:9
        a(:,i) = sin(t-i/5)';
    end
    h = plot(t,a);
    

    正如您在问题中解释的那样,默认行为是首先循环颜色,然后是线条样式。如果您想独立应用它们,请尝试以下操作:

    c = num2cell(get(0,'DefaultAxesColorOrder'),2);
    l = cellstr(get(0,'DefaultAxesLineStyleOrder'));
    set(h, {'Color'}, c(rem((1:numel(h))-1,numel(c))+1), ...
        {'LineStyle'}, l(rem((1:numel(h))-1,numel(l))+1))
    

    您可以将其包装在一个函数中以便于访问(您仍然必须将句柄传递给线条图形对象):

    function applyColorLineStyleIndependently(h)
        %# ...
    end
    

    【讨论】:

    • 非常感谢!这很棒!我从未在set 中使用过元胞数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多