2014-04-29 24 views
8

Tôi đang cố gắng để vẽ đôi đáy trục x theo hình sau khi nhảy:MATLAB: Vẽ đáy đôi x-trục

enter image description here

Nó là một semilogx-cốt truyện trong giờ với cụ thể bổ sung bọ ve biểu thị phút, tháng và năm. Làm cách nào để tạo các dấu tích bổ sung này?

Trả lời

2

Bạn có thể làm điều này bằng cách thêm một đối tượng trục khác vào ô và sau đó đặt thuộc tính của các dấu tick của nó. Một cái gì đó như thế này:

close all 
plot(1:10, 1:10) 
set(gca,'XTick',[1:2:10]) 
haxes1 = gca; 
set(haxes1, 'TickDir', 'out') 
haxes1_pos = get(haxes1,'Position'); % store position of first axes 
haxes2 = axes('Position',haxes1_pos); 
set(gca, 'Color', 'none') 
set(haxes2, 'YTick', []) 
set(haxes2, 'XTickMode', 'manual'); 
set(haxes2, 'XTick', [ 0.1 0.8]) 
set(haxes2, 'TickDir', 'in') 

Ngoài mã trong ví dụ này, bạn sẽ phải chỉnh sửa nhãn đánh dấu và phạm vi trục của đối tượng trục bổ sung. Xem here để tham khảo về các thuộc tính XLim và XTickLabel thực hiện điều đó.

MATLAB hiện không hỗ trợ nhãn đánh dấu bên trong các trục. Chức năng của bên thứ ba xử lý việc này có thể được tìm thấy here.

+0

Một vấn đề: theo cách này bạn sẽ nhận được các dấu tích bên trong nhưng không đánh dấu các nhãn vào bên trong. –

+0

Ngoài ra, trong kết quả cuối cùng, dữ liệu được vẽ sơ đồ ban đầu là vô hình. –

+0

Tôi đã giải quyết cả hai bình luận trong câu trả lời của mình. –

6

Bạn có thể sử dụng cách tiếp cận của Victor May để che phủ một trục phụ, nhưng điều này cần tinh chỉnh nhiều hơn để thực sự hoạt động.

Đầu tiên, chúng ta hãy tái tạo những âm mưu cơ bản:

clear, close 
time = [1/60, 1, 24, 24*7, 24*30, 24*30*6, 24*365, 24*365*10]; 
r = [110, 90, 80, 75, 70, 65, 63, 60]; 

% plot the data 
semilogx(time, r, 'o-') 

% adjust ticks and format of primary axes 
xlim([0.005 1e6]) 
ylim([0 140]) 
tick = 10 .^ (-2 : 6); 
set(gca, 'XTick', tick) 
set(gca, 'XTickLabel', arrayfun(@num2str, tick, 'UniformOutput', false)) 
set(gca, 'XMinorTick', 'off') 
set(gca, 'TickDir', 'out') 

enter image description here

bao phủ một trục thứ cấp chỉ hoạt động đúng nếu nó có cùng vị trí, kích thước, giới hạn trục, và các loại quy mô như tiểu học, nếu nền của nó là trong suốt (nếu không dữ liệu trở thành ẩn):

% put matching secondary axes on top with transparent background 
pos = get(gca, 'Position'); 
axes('Position', pos) 
set(gca, 'Color', 'none') 
xlim([0.005 1e6]) 
ylim([0 140]) 
set(gca, 'XScale', 'log') 
set(gca, 'XMinorTick', 'off') 
set(gca, 'TickDir', 'out') 

Giving nó trở thành ve thích và đánh dấu nhãn

% adjust ticks 
set(gca, 'YTick', []) 
set(gca, 'XTick', time) 
label = {'1 min', '1 hour', '24 hours', '1 week', '1 month', '6 months', '1 year', '10 years'}; 
set(gca, 'XTickLabel', label) 

kết quả trong

enter image description here

- không thực sự những gì chúng ta muốn.

Với một thủ thuật chúng ta có thể để cho các bọ ve và đánh dấu vào nhãn của trục thứ cấp đi vào trong ...

% tinker with it 
set(gca, 'XAxisLocation', 'top') 
pos(4) = eps * pos(4); 
set(gca, 'Position', pos) 

enter image description here

... nhưng điều đó vẫn không thực sự những gì chúng ta muốn.


Một chiến lược khác: Chúng ta không che phủ rìu, nhưng đặt các dấu tích khác trong chính chúng ta!

label = {'1 min', '1 hour', '24 hours', '1 week', '1 month', '6 months', '1 year', '10 years'}; 
line([time', time'], [0 2], 'Color', 'k') 
text(time, 4 * ones(size(time)), label, 'Rotation', 90, 'VerticalAlignment', 'middle') 

Kết quả

enter image description here

vẫn chưa hoàn hảo, nhưng sử dụng được.

+1

Giải pháp cuối cùng với văn bản() cũng làm việc cho tôi, cảm ơn! – gaborous

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