Рисование линии верхней оси (рамки)

У меня есть график с двумя линиями и двумя разными осями X (разными блоками данных), которые я строю следующим образом.

Моя проблема в том, что я хотел бы также нарисовать верхнюю линию окна черным (по горизонтали) и не оставлять ее "открытой", как есть. Было бы замечательно, если бы у линии были также галочки по оси X, такие же, как у нижней горизонтальной линии оси.

Очевидно, что grid on не работает, потому что рисует галочки по оси y справа, а галочки по оси y слева, чего я не хочу.

Кроме того, я думаю, что в Matlab 2014 это сработало: set(ax(2),'XAxisLocation','top','XTickLabel',[]); но это больше не так в Matlab 2015a.

Вот пример:

figure(1);
x = [0, 1, 2, 3];
y_1 = [3, 2, 1.5, 1];
y_2 = [0, 0.5, 0.7, 0.9];
parula_blue = [0, 0.447, 0.741]; parula_red = [0.85, 0.325, 0.098];

[ax, h1, h2] = plotyy(x, y_1, x, y_2);
set(get(ax(1),'Ylabel'),'String','Data 1', 'Color', 'k');
set(h1,'LineWidth',2,'LineStyle','-','Color',parula_blue,'DisplayName', 'Name 1');
set(ax(1),'ycolor',parula_blue);
set(ax(1), 'YTick', [0 1 2 3 4]);
set(ax(1), 'ylim', [0 4]);

set(get(ax(2),'Ylabel'),'String','Data 2', 'Color', 'k');
set(h2,'LineWidth',2,'LineStyle','--','Color',parula_red,'DisplayName','Name 2');
set(ax(2),'ycolor',parula_red);
set(ax(2),'YDir','reverse');
set(ax(2), 'YTick', [0 0.2 0.4 0.6 0.8 1]);

xlabel('X axis desc')
legend('show')
set(ax, 'XTick', x)

set(ax(1),'Box','off') % Turn off box of axis 1, which removes its right-hand ticks
set(ax(2),'Box','off') % Turn off box of axis 2, which removes its left-hand   ticks

введите описание изображения здесь

1 ответ

Решение

Основываясь на этом ответе, вы можете просто добавить еще один axes к вашему графику и укажите, что его горизонтальная ось находится вверху (этот код идет в конце вашего кода):

hBox = axes('xlim', [x(1) x(end)],'XTick', x, 'YTick',[],'XAxisLocation', 'top',...
            'XTickLabel',[]);

Редактировать:

Согласно пояснению ОП в комментарии, можно нарисовать черные оси "под" синим \ оранжевым, переупорядочив дочерние элементы рисунка, а именно, после моего кода выше, добавьте также:

uistack(hBox,'bottom'); %// This sends the black axes to the back.
ax(1).Color = 'none';   %// This makes the plot area transparent for the top axes, so 
                        %// that ticks belonging to the black axes are visible.

введите описание изображения здесь


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

Если вы хотите избежать добавления другого набора axes, вы все еще можете использовать ax(2) но сначала нужно сделать это видимым:

ax(1).Box = 'off';
ax(2).Box = 'off';
ax(2).XAxis.Visible = 'on';
ax(2).XAxisLocation = 'top';
ax(2).XTickLabel = [];
ax(2).XTick = ax(1).XTick ;
Другие вопросы по тегам