Как построить график с тем же X, но другим значением Y в MATLAB? - PullRequest
1 голос
/ 31 марта 2012

Если мои данные выглядят так:

X = [ 1 2  2  3  4  5 5]
Y = [10 9 -5 11 12 -3 7]

Может кто-нибудь сказать, пожалуйста, как я могу представить его как гистограмму в Matlab? Потому что я просто использую bar (X, Y), это говорит о том, что XData не может не иметь дублирующихся значений. Идеальная ситуация заключается в том, что в одной и той же позиции X есть два значения Y. Большое спасибо !!

Ответы [ 4 ]

1 голос
/ 01 апреля 2012

От вашего вопроса я думаю, что вы хотите построить кластерную гистограмму. Для этого вы должны использовать матрицу в MATLAB. Когда вы говорите bar(A), где A - матрица, каждый столбец A берется как ряд данных и будет представлен в кластерах относительно натуральных чисел. Итак, учитывая ваши данные строки X и Y, вы должны сделать:

A=[X;Y]'; %note the single quote for transpose
bar(A)

Вот вывод ваших данных (X синий, Y красный): MATLAB clustered bar graph

0 голосов
/ 01 апреля 2012

Вы должны разделить ваши данные на 2 серии: для положительных и отрицательных значений y.Тогда вы можете построить оба на одной фигуре.

Обратите внимание, что поскольку функция bar использует относительную ширину полос, она зависит от минимального расстояния между значениями x в ряду данных.Если эти числа различаются в двух рядах данных, необходимо откорректировать ширину полосы.

ipos = y>=0;
ineg = y<0;
dpos = min(diff(sort(x(ipos))));
dneg = min(diff(sort(x(ineg))));

w = 0.8;
bar(x(ipos),y(ipos),w);
hold on
bar(x(ineg), y(ineg), w*dpos/dneg, 'facecolor','r');
hold off

Если у вас более 2 значений на x, вы можете использовать другой подход для удаленияуникальные значения через несколько итераций.В этом случае некоторые значения могут перекрываться, поэтому сначала выполните сортировку y.

xx = x;
yy = y;
cla
hold on
w = 0.8;
while ~isempty(xx)
    [xu, idx]  = unique(xx);
    yu = yy(idx);
    xx(idx) = [];
    yy(idx) = [];
    d = min(diff(sort(xu)));
    bar(xu,yu,w/d);
end
hold  off
clear xx yy xu yu d
0 голосов
/ 01 апреля 2012

Я думаю, это то, что вы ищете:

barh(Y,X), xlabel('X'), ylabel('Y')
0 голосов
/ 31 марта 2012

Вместо этого используйте barh().

...