2012-02-11 111 views
5

以下代碼顯示了我的問題。如果蜱不在兩側的相同位置(這是正常情況下...),則plotyy完全失敗(matlabs只能在一邊繪製每個繪圖的座標軸

我需要一個有兩個y軸的繪圖,但只在一側繪製刻度。我被建議使用addaxis,但我不明白這對我有什麼幫助,因爲我不想分開的軸。

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

回答

0

這裏有一個方法,我從mathworks forum了。這個想法是刪除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

'set(AX(2),'XAxisLocation','top','XTickLabel',[]);' – craigim 2014-03-14 15:57:12

0

嘗試將蜱空集:

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',[]); 
+0

對不起,但這不是一個解決方案。我需要兩個y軸上的蜱蟲。雙方都不是雙方! – 2012-02-11 17:19:54

+0

@MatthiasPospiech,請參閱最新的答案。 – 2012-02-11 20:48:57

+0

好主意,但不是真的如何爲出版物創建情節。 – 2012-02-12 21:26:00

2

馬蒂亞斯,

設置XAxisLocation頂部,並禁用XTickLabel。上面的線是背面現在:)

set(AX(2),'XAxisLocation','top', 'XTickLabel',[]) 
0

下面是使用第三軸線的溶液。對於此解決方案,首先按照建議的方式打開框

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