Я хотел бы дать подзаголовки, которые я делаю простой ярлык. К сожалению, я получаю уродливое поведение. Рассмотрят следующую функцию:Маркировка подзаголовка в цифрах MATLAB
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'
, которые я использовал, делают оси действующими так, как будто нет меток. Есть ли какое-либо исправление для этого? На самом деле все, что я делаю, - это получение позиции названия и ярлыка в нормализованных единицах, в отличие от единиц данных, и это, похоже, испортит его.
Причина, по которой мне нужно получить его в нормализованных единицах, заключается в том, что, когда мы получаем 3D-график, я могу поместить метку относительно названия и зелёной метки.
Даже если мы удалим код об изменении 'LooseInset' в тестовом коде, мы по-прежнему получаем такое же поведение с' set_label2'. – jmlopez
, кстати, 'LooseInset' является [недокументированным] (http://undocumentedmatlab.com/blog/axes-looseinset-property/) свойством – Amro