Я хотел бы дать подсюжеты я делаю простой ярлык. К сожалению, я получаю уродливое поведение. Рассмотрим следующую функцию:
function h = set_label1(label)
tlh = get(gca, 'Title');
if strcmp(get(tlh, 'String'), '')
title(' ');
end
ylh = get(gca, 'YLabel');
if strcmp(get(ylh, 'String'), '')
ylabel(' ');
end
ylp = get(ylh, 'Position');
x = ylp(1);
tlp = get(tlh, 'Position');
y = tlp(2);
h = text('String', label, ...
'HorizontalAlignment', 'right',...
'VerticalAlignment', 'Baseline', ...
'FontUnits', 'pixels', ...
'FontSize', 16, ...
'FontWeight', 'bold', ...
'FontName', 'Arial', ...
'Position', [x y 0]);
end
Вот простой тестовый запуск:
figure;
h1 = axes('OuterPosition', [0,0,.5 1]);
set(h1,'LooseInset',get(h1,'TightInset'));
h2 = axes('OuterPosition', [.5,0,.5 1]);
set(h2,'LooseInset',get(h2,'TightInset'));
axes(h1);
plot([0 1], [4 5]);
set_label1('A');
axes(h2);
plot([0 1], [4 5]);
set_label1('B');
Картинка, которую я получаю:
Если вы измените размер фигуры, метки больше не будут в правильном положении. Это нормально, я этого и ожидал (если вы знаете, как вернуть их на место, и расскажете нам, это сделает меня очень счастливым).
Проблема, с которой я столкнулся, заключается в том, что я не хочу указывать положение метки в единицах «данных». Вместо этого я хочу использовать нормализованные единицы измерения. Поэтому я использовал модифицированную форму функции. Теперь воспользуемся этим:
function h = set_label2(label)
tlh = get(gca, 'Title');
if strcmp(get(tlh, 'String'), '')
title(' ');
end
ylh = get(gca, 'YLabel');
if strcmp(get(ylh, 'String'), '')
ylabel(' ');
end
oldUnits = replace_prop(ylh, 'Units', 'normalized');
ylp = get(ylh, 'Position');
x = ylp(1);
set(ylh, 'Units', oldUnits);
oldUnits = replace_prop(tlh, 'Units', 'normalized');
tlp = get(tlh, 'Position');
y = tlp(2);
set(ylh, 'Units', oldUnits);
h = text('String', label, ...
'HorizontalAlignment', 'right',...
'VerticalAlignment', 'Baseline', ...
'FontUnits', 'pixels', ...
'FontSize', 16, ...
'FontWeight', 'bold', ...
'FontName', 'Arial', ...
'Units', 'normalized',...
'Position', [x y 0]);
end
function oldvalue = replace_prop(handle, propName, newvalue)
oldvalue = get(handle, propName);
set(handle, propName, newvalue);
end
Запуск того же теста:
figure;
h1 = axes('OuterPosition', [0,0,.5 1]);
set(h1,'LooseInset',get(h1,'TightInset'));
h2 = axes('OuterPosition', [.5,0,.5 1]);
set(h2,'LooseInset',get(h2,'TightInset'));
axes(h1);
plot([0 1], [4 5]);
set_label2('A');
axes(h2);
plot([0 1], [4 5]);
set_label2('B');
Получаем точно такую же картину, как и раньше. Единственная проблема в том, что когда мы изменяем его размер, происходит что-то плохое:
На самом деле метки находятся в правильном положении. Но кажется, что свойства 'LooseInset'
и 'TightInset'
, которые я использовал, заставляют оси вести себя так, как будто меток нет. Есть ли какое-нибудь решение для этого? На самом деле все, что я делаю, это получаю положение заголовка и ylabel в нормализованных единицах, а не в единицах данных, и это, кажется, все испортило.
Причина, по которой мне нужно получить его в нормализованных единицах, заключается в том, что когда мы получаем трехмерный график, я могу расположить метку относительно заголовка и zlabel.
LooseInset
в тестовом коде, мы все равно получим такое же поведение сset_label2
. - person jmlopez   schedule 22.06.2012LooseInset
является недокументированным свойством. - person Amro   schedule 23.06.2012