2016-10-30 1 views
0

Mon objectif est de tracer 2 fonctions principales différentes sur la même figure, mais aussi de tracer des fonctions similaires à celles de ces 2 fonctions originales. Par exemple, la première fonction sera rouge et solide, ses fonctions similaires suivantes seront de la même couleur, mais passeront par des styles de lignes différents, de même pour la deuxième fonction, ils seront tous bleus, mais aussi des styles de lignes. Voici quelques exemples de code:Comment faire défiler les styles de trait dans Octave tout en conservant la même couleur?

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 

Je suis en train de placer « - » ou « : » citations et bien où mon choose_lstyle est. Fondamentalement, c'est exactement comme si vous aviez un seul style de ligne où il est entre guillemets, sauf que j'essaie de faire défiler les styles de ligne.

L'erreur que je reçois lors de l'exécution c'est:

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 
+2

Comme il est dit, vous passez des arguments non valides. Essayez 'lstyle = {'-', '-', ':', '-.'}' – stephematician

+0

@StephenWade Je crois que cela ne fonctionnera pas car il retournera un tableau de type tableau (ou alors?). Vous pouvez, cependant, essayer 'lstyle = ['-'; '-'; ':'; '-.'; '-']' et 'choose_lstyle = strtrim (lstyle (i, :))' – 0range

+1

Cela fonctionne pour moi. Il retournera un tableau de cellules si vous indexez dans lstyle avec '()' au lieu de '{}'. – stephematician

Répondre

1

Vous avez eu plusieurs erreurs là, voici un code de travail:

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

Ne hésitez pas à demander une partie peu claire dans les commentaires.


Ce code vous donnera des résultats similaires, mais il est plus compact et efficace:

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 

Si vous êtes version de Matlab est erlier puis 2014, ou vous regardez un code compact , vous pouvez également écrire:

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)).'); 
+0

Merci :). Celui-ci fonctionne presque pour moi. Peut-être qu'Octave 4.0.0 (que j'utilise) ne supporte pas le style de codage «. – magnetar

+0

Mais le 1er bloc de code fonctionne, alors merci! – magnetar

+0

@magnetar La deuxième partie ne fonctionne pas non plus dans les versions de MATLAB antérieures à 2014. – EBH