Как построить несколько кривых в MATLAB, используя ручки

Я рисую данные в MATLAB в реальном времени. Я хочу использовать ручку. Моя проблема в том, что я не знаю, как построить более одной кривой Y-данных.

Я нашел следующий код. Он показывает, как построить один набор YData. Есть ли у кого-нибудь идея преобразовать код в два или более набора Y-данных, например. sind(x) как дополнительную кривую на графике?

x = 1:1000;
y = cosd(x);

xi = x(1);
yi = y(1);
h = plot(xi, yi, 'YDataSource', 'yi', 'XDataSource', 'xi');

for k = 2:1000...
xi = x(1:k);
yi = y(1:k);
refreshdata(h, 'caller');
drawnow;
end;

person user1677716    schedule 25.10.2012    source источник
comment
Связанный: stackoverflow.com/questions/13102654/   -  person Andrey Rubshtein    schedule 28.10.2012


Ответы (4)


Код ниже работает для меня, если вы действительно хотите использовать дескрипторы

x = 1:1000;
y = cosd(x);
y2 = sind(x);

xi = x(1);
yi = y(1);
yi2 = y2(1);
figure(1); clf;
h = plot(xi, yi, 'YDataSource', 'yi', 'XDataSource', 'xi');
hold on;
h2 = plot(xi, yi2, 'YDataSource', 'yi2', 'XDataSource', 'xi');

for k = 200:1000
    xi = x(1:k);
    yi = y(1:k);
    yi2 = y2(1:k);
    refreshdata(h);
    refreshdata(h2);
    drawnow;
end;

Вам нужен hold on.

Также вместо refreshdata можно использовать set, как предложил Андрей:

set(h,'Xdata',xi,'YData',yi);
set(h2,'Xdata',xi,'YData',yi2);
person angainor    schedule 25.10.2012
comment
Большое спасибо! Для меня ваш пример сделал это! Теперь график в реальном времени показывает несколько кривых. Отличный ответ! - person user1677716; 25.10.2012

Прежде всего, никогда не используйте refreshdata. Вместо этого используйте прямой метод set.

        set(h,'Xdata',xi,'YData',yi);

Во-вторых, следует делать два сюжета

      h1 = plot(xi, yi);
      h2 = plot(xi, yi);

И обновить каждый соответственно.

person Andrey Rubshtein    schedule 25.10.2012
comment
Пока большое спасибо Андрей. Если я сделаю два сюжета, не значит ли это, что фигур будет две? Я новичок в Matlab, так что извините меня, если эта идея глупа. - person user1677716; 25.10.2012
comment
Андрей, а почему бы не использовать refreshdata? - person angainor; 25.10.2012
comment
@angainor, очень хороший вопрос. Я просто написал это как вопрос и ответ stackoverflow.com/questions/13102654/. - person Andrey Rubshtein; 27.10.2012

Возможно, вы ищете команду hold?

plot(1 : 10, (1 : 10).^2, 'r')
hold on
plot(1 : 10, (1 : 10).^3)

РЕДАКТИРОВАТЬ:

Вы можете использовать hold в сочетании с set для обновления графика (см. также ответ Андрея):

h1 = plot(1 : 10, (1 : 10).^2, 'r');
hold on;
h2 = plot(1 : 10, (1 : 10).^3);
set(h1, 'XData', 1 : 2 : 20);
set(h2, 'YData', 0.1 * (1 : 20).^3);

Оси обновятся автоматически.

person Florian Brucker    schedule 25.10.2012
comment
Привет, Флориан. Я читал, что при построении графиков в реальном времени более эффективно использовать дескрипторы. Кроме того, держись морозит мои топоры (пожалуй, наконец), чего я не желаю. Реализация хорошо работает с дескрипторами, за исключением того факта, что я не могу построить несколько линий. - person user1677716; 25.10.2012
comment
@user1677716 user1677716 hold on не замораживает ваши оси. - person angainor; 25.10.2012
comment
@ user1677716: Вы можете использовать hold вместе с дескрипторами, см. мое редактирование. Кроме того, как указал angainor, оси по-прежнему будут автоматически обновляться. - person Florian Brucker; 25.10.2012
comment
Если вам нравится удержание, удержание даст вам несколько кривых одного цвета. Используйте Hold all, чтобы получить кривые разного цвета (как если бы вы построили все кривые с помощью одной команды построения графика). - person engineerC; 25.10.2012

Если вас не слишком заботит отображение одного цвета для всех кривых, просто объедините данные x в один вектор, разделенный NaN между компонентами кривой (сделайте то же самое для данных y). Затем команда «plot» может принять эти большие векторы x и y и отобразить все сразу. Вы можете обойти проблему с цветом, выполнив нечто подобное с массивом данных цвета.

person Peter Lawrence    schedule 20.05.2014