2016-10-30 2 views
0

Моя цель состоит в том, чтобы отобразить две разные основные функции на одной фигуре, но также иметь возможность строить поверх тех похожих функций, которые связаны с тем, как эти оригинальные 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 

Я пытаюсь поместить «-» или «:» кавычки и все в порядке, где мой 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 
+2

Как говорится, вы передаете недопустимые аргументы. Попробуйте 'lstyle = {'-', '-', ':', '-.'}' – stephematician

+0

@StephenWade Я считаю, что это не сработает, поскольку оно вернет массив (или так?) Тип данных. Вы можете, однако, попробовать 'lstyle = ['-'; '-'; ':'; '-.'; '-']' и 'choose_lstyle = strtrim (lstyle (i, :))' – 0range

+1

Это работает для меня. Он вернет массив ячеек, если вы индексируете в lstyle с помощью '()' вместо '{}'. – stephematician

ответ

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 

Если Youre версия MATLAB является erlier то 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)).'); 
+0

Спасибо :). Это почти работает для меня. Возможно, Octave 4.0.0 (то, что я использую) не поддерживает стиль кодирования dot '.'. – magnetar

+0

Но первый блок кода действительно работает, так что спасибо! – magnetar

+0

@magnetar Вторая часть также не работает в версиях MATLAB раньше 2014 года. – EBH

Смежные вопросы