MATLAB: set line's color and style order to be applied in parallel

后端 未结 2 525
清酒与你
清酒与你 2021-01-02 20:12

When you set DefaultAxesColorOrder and DefaultAxesLineStyleOrder MATLAB will first cycle through all colors with the first style, then again throug

相关标签:
2条回答
  • 2021-01-02 20:32

    I don't see a way to do this directly out of the box. The straightforward way is to set the color/style manually for each line.

    Here is a more automated solution. Let's start with an example taken from the documentation:

    %# 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);
    

    As you explained in your question, the default behavior is to cycle through the colors first, then the line styles. If you want to apply them independently, try the following:

    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))
    

    You can maybe wrap that in a function for convenient access (you still have to pass the handles to the lines graphic objects):

    function applyColorLineStyleIndependently(h)
        %# ...
    end
    

    enter image description here

    0 讨论(0)
  • 2021-01-02 20:41

    Amro's approach works well. Just as a note, you don't have to set the defaults to do this. You can do something like this

    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)
    

    Edit: the mycolors() function is home made. I define

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

    (the color names are from this http://www.rapidtables.com/web/color/RGB_Color.htm). Then I scale them to [0,1] via

    c = fieldnames(colors);
    for i = 1:numel(c)
        colors.(c{i}) = colors.(c{i})/255;
    end
    
    0 讨论(0)
提交回复
热议问题