Рисование линии верхней оси (рамки)
У меня есть график с двумя линиями и двумя разными осями 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 ;