Tôi đã viết một hàm nên làm chính xác những gì bạn muốn. Nó giữ các trục tại cùng kích thước chính xác và vị trí, nó di chuyển x nhãn xuống và làm tăng kích thước hình phải đủ lớn để hiển thị các nhãn:
function moveLabel(ax,offset,hFig,hAxes)
% get figure position
posFig = get(hFig,'Position');
% get axes position in pixels
set(hAxes,'Units','pixels')
posAx = get(hAxes,'Position');
% get label position in pixels
if ax=='x'
set(get(hAxes,'XLabel'),'Units','pixels')
posLabel = get(get(hAxes,'XLabel'),'Position');
else
set(get(hAxes,'YLabel'),'Units','pixels')
posLabel = get(get(hAxes,'YLabel'),'Position');
end
% resize figure
if ax=='x'
posFigNew = posFig + [0 -offset 0 offset];
else
posFigNew = posFig + [-offset 0 offset 0];
end
set(hFig,'Position',posFigNew)
% move axes
if ax=='x'
set(hAxes,'Position',posAx+[0 offset 0 0])
else
set(hAxes,'Position',posAx+[offset 0 0 0])
end
% move label
if ax=='x'
set(get(hAxes,'XLabel'),'Position',posLabel+[0 -offset 0])
else
set(get(hAxes,'YLabel'),'Position',posLabel+[-offset 0 0])
end
% set units back to 'normalized' and 'data'
set(hAxes,'Units','normalized')
if ax=='x'
set(get(hAxes,'XLabel'),'Units','data')
else
set(get(hAxes,'YLabel'),'Units','data')
end
end
Trong trường hợp này offset
phải là tuyệt đối bù đắp trong pixel. Nếu bạn muốn bù đắp tương đối, tôi nghĩ rằng chức năng này có thể dễ dàng được viết lại. hFig
là tay cầm hình và hAxes
các trục xử lý.
EDIT: tạo hình bằng cách sử dụng hFig = figure;
và các trục theo hAxes = axes;
(sau đó thiết lập các trục như bạn đã làm trong câu hỏi: set(hAxes,...)
) trước khi gọi hàm.
EDIT2: thêm các dòng trong đó 'Units'
của hAxes
và XLabel
được đổi lại thành 'chuẩn hóa' và 'dữ liệu' tương ứng. Bằng cách đó, con số vẫn theo cách bạn muốn sau khi thay đổi kích thước.
EDIT3: đã sửa đổi chức năng hoạt động cho cả nhãn X và Y. Mục nhập bổ sung ax
phải là 'x'
hoặc 'y'
.
Có sự khác biệt đáng chú ý nào khi giải quyết trục y? Tôi cho rằng bản thân cốt truyện bằng cách nào đó cần phải được di chuyển trong trường hợp đó, đúng không? – Niko
Tôi nghĩ rằng mã này được chuyển đổi khá dễ dàng để hoạt động trên trục y. Tôi đang ở trong xe buýt ngay bây giờ, vì vậy không thể làm điều đó ngay bây giờ, nhưng tôi sẽ xem xét nó sau tối nay (trong vòng một vài giờ) – ThijsW
Vì một số lý do, phương pháp này không thành công, ví dụ: 50 pixel bù đắp trên trục x.Trong thiết lập của tôi, nhãn sau đó được cắt làm đôi. Tuy nhiên, trong phạm vi mong muốn của một vài điểm ảnh chức năng này hoạt động như một nét duyên dáng, vì vậy cảm ơn bạn rất nhiều! – Niko