2012-02-11 24 views
5

Mã sau đây cho thấy sự cố của tôi. plotyy hoàn toàn thất bại nếu các ve không ở cùng vị trí trên cả hai mặt (mà đúng hơn là trường hợp bình thường ...)mẫu thiết kế với trục cho mỗi ô chỉ trên một mặt

Tôi yêu cầu một ô có hai trục y nhưng các dấu chỉ ở một bên. Tôi đã được đề nghị sử dụng addaxis, nhưng tôi không thấy làm thế nào mà giúp tôi, vì tôi không muốn trục riêng biệt.

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

Trả lời

0

Đây là cách tiếp cận mà tôi nhận được từ mathworks forum. Ý tưởng là để loại bỏ các tài sản hộp, mà tạo ra các tics ở phía đối diện.

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 

Nhược điểm là, dòng trên biến mất. Nếu ai đó biết làm thế nào để có được nó trở lại đó sẽ là tuyệt vời. Mybe với một âm mưu trống rỗng trên cốt truyện hiện tại với cùng kích thước ??

enter image description here

+0

'bộ (AX (2), 'XAxisLocation', 'trên cùng', 'XTickLabel', []);' – craigim

0

Hãy thử thiết lập ve để tập rỗng:

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

hoặc

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

Chỉnh sửa (1): Bạn có thể tự tạo các nhãn cho trái bên và đặt bên phải thành []:

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

Xin lỗi, nhưng đây không phải là một giải pháp. Tôi yêu cầu ve trên cả hai trục y.không chỉ ở cả hai bên! –

+0

@MatthiasPospiech, vui lòng xem câu trả lời cập nhật. –

+0

Ý tưởng hay, nhưng không thực sự làm thế nào lô được tạo ra cho các ấn phẩm. –

2

để Matthias,

thiết lập XAxisLocation lên trên, và vô hiệu hóa các XTickLabel. dòng trên là trở lại bây giờ :)

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

Dưới đây là một giải pháp sử dụng một trục thứ ba. Đối với giải pháp này trước tiên, hãy chuyển các hộp theo đề xuất

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 

Bây giờ, thêm một trục thứ ba ở cùng vị trí.

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

Một cũng có thể liên kết trục 'x' của tất cả các đối tượng trục. Các giới hạn và bọ ve sau đó sẽ được cập nhật cho phù hợp.

linkaxes([ax ax3], 'x') 

di chúc này, tuy nhiên, không đúng cách cập nhật các ve của trục thứ ba, trừ khi bạn viết một callback thích hợp, mà thậm chí còn nhiều hơn khó khăn để làm trong MATLAB 2014b trở lên Để thực hiện 'thực tế' trục các trục hiện tại, người ta có thể sử dụng

axes(ax) 

Ví dụ:

enter image description here

Các vấn đề liên quan