Одинаково разнесенные значения Х для значений, которые не равны - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь отобразить дискретный график со значениями на оси абсцисс, которые не являются одинаковыми пробелами, но я хочу, чтобы они отображались на одинаковом расстоянии.Мне бы хотелось, чтобы график ствола с первым стержнем находился не на оси Y, и я также хотел бы иметь горизонтальную пунктирную линию при y = 1.

Итак, вот что я попробовал.

x = [10 50 150 3000];
y = [.6 .754 .853 .954]; 
xv = [1 2 3 4];
stem(xv,y);
set(gca,'XTickLabel',x);

К сожалению, это не то, что я ожидал.Значения на оси X неправильны, и стержни начинаются на оси Y и заканчиваются на краю фигуры.Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

РЕДАКТИРОВАТЬ: Я изначально забыл горизонтальную пунктирную линию. Добавил это.


Вам просто нужно два крошечных дополнения:

x = [10 50 150 3000];
y = [.6 .754 .853 .954]; 
xv = [1 2 3 4];
stem(xv, y);
xlim([min(xv)-1 max(xv)+1]);   % <--
set(gca, 'xtick', xv);         % <--
set(gca, 'xticklabel', x);

Вам (также) необходимо явно установить параметр xtick, чтобы рисовались только эти галочки, а не другие.

С помощью xlim вы можете управлять пределами оси X. (Левая и правая границы могут быть изменены в соответствии с вашими потребностями.)

Чтобы добавить горизонтальную пунктирную линию, просто добавьте следующее в конце:

hold on;
plot([min(xv)-1 max(xv)+1], [1 1], 'k--');
hold off;

(Начальная и конечная точки линии могут быть изменены в соответствии с вашими потребностями.)

Начиная с Matlab R2018b, вы также можете использовать yline.

Выходные данные выглядят так:

enter image description here

1 голос
/ 24 апреля 2019

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

MATLAB хорошо справляется с этими задачами без лишних хитростей, чтобы равномерно распределить их по осям, если вы явно объявите значения как categorical.

Все, что вам нужно, это:

x = [10 50 150 3000];
y = [.6 .754 .853 .954]; 
stem(categorical(x),y);
yline(1,'--');
ylim([0 1.5]) % Make some space on the y-axis so the horizontal line doesn't sit on the top edge

Result

...