Матлабс плотыый с осью для каждого сюжета только на одной стороне - PullRequest
5 голосов
/ 11 февраля 2012

Следующий код показывает мою проблему. plotyy полностью терпит неудачу, если галочки не находятся в одинаковых позициях с обеих сторон (что является довольно нормальным случаем ...)

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

clf;
clc;
xaxis = 0:0.1:25;
ydata1 = linspace(12.1712,12.7679, length(xaxis));
ydata2 = linspace(0.3597,-28.7745, length(xaxis));

[AX,H1,H2] = plotyy(xaxis, ydata1, xaxis, ydata2);

% axis limits - x axis (min to max)
xlimits(1) = min(xaxis); xlimits(2) = max(xaxis);
set(AX, 'XLim', xlimits);
set(AX(2),'XTick',[]);

% y1 axis limits 
ylimits(1) = min(ydata1); ylimits(2) = max(ydata1);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
set(AX(1), 'YLim', ylimits);

% y2 axis limits 
ylimits(1) = min(ydata2); ylimits(2) = max(ydata2);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
set(AX(2), 'YLim', ylimits);

% y1 ticks 
set(AX(1),'YTick',[12.0:0.1:12.8]);
% y2 ticks 
set(AX(2),'YTick',[-25:5:0]);

print(gcf, ['-r' num2str(400)], ['test' '.png' ], ['-d' 'png']);

enter image description here

Ответы [ 4 ]

2 голосов
/ 27 апреля 2012

для Матиаса,

установите XAxisLocation на верх и отключите XTickLabel.верхняя строка вернулась:)

set(AX(2),'XAxisLocation','top', 'XTickLabel',[])
0 голосов
/ 30 января 2015

Вот решение с использованием третьей оси. Для этого решения сначала включите коробки как предложено

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

Теперь дополнительно добавьте третью ось в той же позиции.

    ax3 = axes( 'Position',         get(ax(1), 'Position'),...
                'XAxisLocation',    'top',...
                'XTickLabel',       my_XTickLabels_on_top,...
                'YColor',           'none',...
                'YTick',            [],...
                'YTickLabel',       [],...
                'Color',            'none', ...
                cell_with_further_pValPairs{:});

Можно также связать ось 'x' всех объектов осей. Лимиты и отметки будут соответственно обновлены.

    linkaxes([ax ax3], 'x')

Это, однако, не будет правильно обновлять галочки третьей оси , если вы не напишите правильный обратный вызов, который стал еще сложнее сделать в MATLAB 2014b и выше Чтобы сделать «настоящие» оси текущими осями, можно использовать

    axes(ax)

Пример: * * один тысяча двадцать-одна enter image description here

0 голосов
/ 13 февраля 2012

Вот подход, который я получил от форума mathworks .Идея состоит в том, чтобы удалить свойство box, которое создает метки на противоположной стороне.

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

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

enter image description here

0 голосов
/ 11 февраля 2012

Попробуйте установить галочки на пустой набор:

 set(AX(2),'YTick',[]);

или

 set(AX(1),'YTick',[]);

Редактировать (1) : Вы можете вручную создать метки для левой стороны и установить для правой стороны значение []:

clf;
clc;
xaxis = 0:0.1:25;
ydata1 = linspace(12.1712,12.7679, length(xaxis));
ydata2 = linspace(0.3597,-28.7745, length(xaxis));

[AX,H1,H2] = plotyy(xaxis, ydata1, xaxis, ydata2);

% axis limits - x axis (min to max)
xlimits(1) = min(xaxis); xlimits(2) = max(xaxis);
set(AX, 'XLim', xlimits);
set(AX(2),'XTick',[]);

% y1 axis limits 
ylimits(1) = min(ydata1); ylimits(2) = max(ydata1);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
set(AX(1), 'YLim', ylimits);

x  = linspace(ylimits(1),ylimits(2),10);
ticks1 =  arrayfun(@(t){sprintf('%2.2f',t)},x);


% y2 axis limits 
ylimits(1) = min(ydata2); ylimits(2) = max(ydata2);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
x  = linspace(ylimits(1),ylimits(2),10);
ticks2 =  arrayfun(@(t){sprintf('%2.2f',t)},x);
set(AX(2), 'YLim', ylimits);

ticks = cell(size(ticks1));
for i=1:numel(ticks1)
    ticks{i} = sprintf('%s / %s',ticks1{i},ticks2{i});
end
% y1 ticks 
set(AX(1),'YTickLabel',ticks);
% % y2 ticks 
set(AX(2),'YTick',[]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...