如何在保持相同颜色的同时在Octave中循环使用线条样式?

时间:2016-10-30 05:46:12

标签: matlab plot octave matlab-figure linestyle

我的目标是在同一个图上绘制2个不同的主要函数,但也能够在与原始2个函数如何演变相关的那些类似函数之上进行绘图。例如,第一个函数将是红色和实色,其后续的相似函数将是相同的颜色,但循环通过不同的线条样式,类似于第二个函数,它们都将是蓝色但也将循环通过线条样式。以下是一些示例代码:

lstyle = {" '-' ", " '--' ", " ':' ", " '-.' "};
i=1;

%Plot:
for n=1:3
  choose_lstyle = lstyle{i};
  y1 = (z.*n).^2;
  y2 = (z.*n).^3;
  plot(z,y1,'r','linestyle',choose_lstyle);
  plot(z,y2,'b','linestyle',choose_lstyle);
  n++;
  if i < length(lstyle) %cycle through line styles
    i = i+1;
    else
    i = 1;
  end
  hold on;
end

我正试图安排&#39; - &#39;或者&#39;:&#39;引号和我的choose_lstyle所在的地方。基本上它就像你只有一种线条样式的引号一样,除了我试图循环线条样式。

运行时遇到的错误是:

error: set: invalid value for radio property "linestyle" (value =  '-' )
error: called from
__line__ at line 120 column 16
line at line 56 column 8
__plt__>__plt2vv__ at line 500 column 10
__plt__>__plt2__ at line 246 column 14
__plt__ at line 113 column 17
plot at line 220 column 10
PROGRAM_NAME at line 37 column 3
enter code here

1 个答案:

答案 0 :(得分:1)

你有几个错误,这是一个有效的代码:

lstyle = {'-','--',':','-.'};
z = 1:100;

%Plot:
k = 1;
for n = 1:10
    y1 = (z.*n).^2;
    y2 = (z.*n).^2.1; % I changed it from 3 so you can see the red lines
    plot(z,y1,'r',z,y2,'b','linestyle',lstyle{k});
    if k < length(lstyle) %cycle through line styles
        k = k+1;
    else
        k = 1;
    end
    hold on;
end

line_style

随意在评论中询问任何不清楚的部分。

此代码将为您提供类似的结果,但它更紧​​凑,更高效:

lstyle = {'-','--',':','-.'};
z = 1:10;
by = bsxfun(@times,z.',1:10).^2;
ry = bsxfun(@times,z.',1:10).^2.1;
p = plot(z,ry,'r',z,by,'b');
k = 1;
for n = 1:numel(p)
    p(n).LineStyle = lstyle{k};
    k = k+1;
    if k > numel(lstyle)
        k = 1;
    end   
end

如果你的MATLAB版本比2014年更早,或者你只是寻找一个紧凑的代码,你也可以写:

lstyle = {'-','--',':','-.'};
z = 1:10;
by = bsxfun(@times,z.',1:10).^2;
br = bsxfun(@times,z.',1:10).^2.1;
p = plot(z,br,'r',z,by,'b');
lineStyles = repmat(lstyle,1,ceil(numel(p)/numel(lstyle)));
set(p,{'LineStyle'},lineStyles(1:numel(p)).');