Маркировка участков так, чтобы метка была выровнена с ylabel вне осей - PullRequest
0 голосов
/ 17 июня 2019

Пожалуйста, смотрите следующий код, который создает 2 к 2 подзаговора с некоторыми графиками:

x = linspace(0,2*pi);
y = sin(x);
hfig = figure('Position',[1317 474 760 729]);
subplot(2,2,1)
plot(x,y)
ylabel('plot1');
subplot(2,2,2)
plot(x,y.^2)
ylabel('plot2');
subplot(2,2,3)
plot(x,y.^3)
ylabel('plot3');
subplot(2,2,4)
plot(x,abs(y))
ylabel('plot4');

в каждом, я добавил метки вручную в Инструменты: Редактировать график (a) (b) (c) (d) создание этой фигуры:

image 1

Проблема в том, что если я изменю размер графика, они больше не будут совмещены с текстом ylabel:

image 2

Есть ли способ добавить эти метки программно и автоматически выровнять их по тексту ylabel?Я удивлен, что в MATLAB уже нет чего-то подобного.

Спасибо

1 Ответ

4 голосов
/ 17 июня 2019

Это непросто сделать, не подключив слушателя к событию изменения размера фигуры (см. пример ), и не выполнив некоторые вычисления, связанные с соотношениями сторон.

Это не совсемПонятно, какие объекты являются вашими метками (text или annotation), поэтому я просто покажу, как сделать это программно с помощью команды text, которая создает метки на осях координаты (в отличие от цифра координаты).Это не решает проблему полностью, но выглядит лучше, возможно, в приемлемой степени:

function q56624258
x = linspace(0,2*pi);
y = sin(x);
hF = figure('Position',[-1500 174 760 729]);

%% Create plots
[hAx,hYL] = deal(gobjects(4,1)); 
for ind1 = 1:3
  hAx(ind1) = subplot(2,2,ind1, 'Parent' , hF);
  plot(hAx(ind1), x,y.^ind1);
  hYL(ind1) = ylabel("plot" + ind1);
end

hAx(4) = subplot(2,2,4);
plot(hAx(4), x,abs(y));
hYL(4) = ylabel('plot4');

%% Add texts (in data coordinates; x-position is copied from the y-label)
for ind1 = 1:4
  text(hAx(ind1), hYL(ind1).Position(1), 1.1, ['(' char('a'+ind1-1) ')'], ...
    'HorizontalAlignment', 'center');
end

enter image description here

Обратите внимание на несколько изменений в вашем коде:

  • Дескрипторы, возвращаемые некоторыми функциями, которые создают графические элементы, теперь сохраняются (в основном: hAx, hYL).
  • Все функции, которые создают графические элементы (subplot, plot, ylabel), теперь имеют указанную цель (т.е. родительский элемент или контейнер).
  • Я изменил 'Position' изрисунок, чтобы он работал в моей настройке (вы можете изменить его обратно).
...