Как выровнять подграфики MATLAB?

Мои подграфики MATLAB не выровнены идеально, см. зеленый прямоугольник на рисунке нижевведите здесь описание изображения. Как избежать этого смещения?

Вот что я пытаюсь

clear all;
clc;

RF=RF_data(:,2:end);

figure

subplot(3,4,1)

pos_pre = 1.3:1:3.3;    % for positioning

boxplot(RF(2:71,[45,47,46]),...
    'colors','b','positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '}) 
hold on  

pos_post = 1.55:1:3.55;   % Ignore this comment

boxplot(RF(72:end,[45,47,46]),'colors','r',...
    'positions',pos_post,'width',0.18,'symbol', 'rd','OutlierSize',3,...
    'factorseparator',1); 

set(gca,'XTick',1.5:1:3.5)  
set(gca,'XTickLabel',{'10a', '10b', '10c'}, 'FontSize', 7)

X = get(gca,'XLim');  
Y = get(gca,'YLim');
hold off 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

subplot(3,4,2)

pos_pre = 1.3:1:3.3;   % Ignore this comment

boxplot(RF(2:71,[17,16,15]),...
    'colors','b','positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '})  
hold on  

pos_post = 1.55:1:3.55;  % Ignore this comment

boxplot(RF(72:end,[17,16,15]),'colors','r',...
    'positions',pos_post,'width',0.18,'symbol', 'rd','OutlierSize',3,...
    'factorseparator',1); 

set(gca,'XTick',1.5:1:3.5) 
set(gca,'XTickLabel',{'7a', '7b', '7c'}, 'FontSize', 7) 

hold off 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

subplot(3,4,3)

pos_pre = 1.3:1:3.3;  % Ignore this comment

boxplot(RF(2:71,[54, 53, 52]),'colors','b',...
    'positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '})  
hold on  

pos_post = 1.55:1:3.55;  

boxplot(RF(72:end,[54, 53, 52]),'colors','r',...
    'positions',pos_post,'width',0.18,'symbol', 'rd','OutlierSize',3,...
    'factorseparator',1); 

set(gca,'XTick',1.5:1:3.5)  
set(gca,'XTickLabel',{'6a', '6b', '6c', '6d', '6e', '6f', '6g'}, 'FontSize', 7)

hold off 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

subplot(3,4,4)

pos_pre = 1.3:1:3.3;  

boxplot(RF(2:71,[76,75,74]),...
    'colors','b','positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '})  
hold on  

pos_post = 1.55:1:3.55;  

boxplot(RF(72:end,[76,75,74]),'colors','r',...
    'positions',pos_post,'width',0.18,'symbol', 'rd','OutlierSize',3,...
    'factorseparator',1); 

set(gca,'XTick',1.5:1:3.5)  
set(gca,'XTickLabel',{'5a', '5b', '5c', '5d', '5e', '5f', '5g', '5h'}, 'FontSize', 7)

X = get(gca,'XLim');  
Y = get(gca,'YLim');
hold off 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(3,4,(5:6))

pos_pre = 1.3:1:8.3;  

boxplot(RF(2:71,[32,31,30,50,62,85,86,34]),...
    'colors','b','positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '})  
hold on  

pos_post = 1.55:1:8.55;  

boxplot(RF(72:end,[32,31,30,50,62,85,86,34]),'colors','r',...
    'positions',pos_post,'width',0.18,'symbol', 'rd','OutlierSize',3,...
    'factorseparator',1); 

set(gca,'XTick',1.5:1:8.5)
set(gca,'XTickLabel',{'5a', '5b', '5c', '5d', '5e', '5f', '5g', '5h'}, 'FontSize', 7)

hold off 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

subplot(3,4,(7:8))

pos_pre = 1.3:1:7.3;  

boxplot(RF(2:71,[12, 11, 42, 41, 40, 79, 78]),...
    'colors','b','positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '})  
hold on  

pos_post = 1.55:1:7.55;  

boxplot(RF(72:end,[12, 11, 42, 41, 40, 79, 78]),'colors','r',...
    'positions',pos_post,'width',0.18,'symbol', 'rd','OutlierSize',3,...
    'factorseparator',1); 

set(gca,'XTick',1.5:1:7.5) 
set(gca,'XTickLabel',{'6a', '6b', '6c', '6d', '6e', '6f', '6g'}, 'FontSize', 7)

hold off 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(3,4,(9:12))

pos_pre = 1.3:1:19.3;  

boxplot(RF(2:71,[1,63,89,88,87,27,80,33,26,28,39,9,21,72,77,19,18,38,5]),...
    'colors','b','positions',pos_pre,'width',0.18,...
    'symbol', 'bd', 'OutlierSize',3);
set(gca,'XTickLabel',{' '})  
hold on  

pos_post = 1.55:1:19.55;  

boxplot(RF(72:end,[1,63,89,88,87,27,80,33,26,28,39,9,21,72,7,19,18,38,5]),...
    'colors','r','positions',pos_post,'width',0.18,'symbol', 'rd',...
    'OutlierSize',3,'factorseparator',1); 

set(gca,'XTick',1.5:1:19.5)
set(gca,'XTickLabel',{'2a', '2b', '2c', '2d', '2e', '2f', '2g','2e','2f','2g','2h',...
    '2i','2j','2k','2l','2m','2n','2o','2p','2q','2r','2s'}, 'FontSize', 7)


X = get(gca,'XLim');  
Y = get(gca,'YLim');
hold off 

text('Position',[0.85*X(1,2), 0.9*Y(1,2)],'String','1901-1970',...
    'color', 'b', 'FontWeight', 'bold', 'FontSize', 8) 

text('Position',[0.85*X(1,2), 0.8*Y(1,2)],'String','1971-2013',...
    'color', 'r', 'FontWeight', 'bold', 'FontSize', 8) 

%%
disp('Done')

Он просит добавить больше деталей, поэтому я просто пишу случайные вещи.


person dSb    schedule 26.03.2016    source источник
comment
Это прекрасно работает! mathworks.com/matlabcentral/fileexchange/39664-subtightplot   -  person jkazan    schedule 26.03.2016
comment
как вы создали эти подсюжеты? какой-нибудь код для воспроизведения, пожалуйста..   -  person Amro    schedule 26.03.2016


Ответы (1)


Я не вижу проблемы в этом примере:

% first row
subplot(3,4,1), plot(cumsum(randn(100,1)))
subplot(3,4,2), plot(cumsum(randn(100,1)))
subplot(3,4,3), plot(cumsum(randn(100,1)))
subplot(3,4,4), plot(cumsum(randn(100,1)))

% second row
subplot(3,2,3), plot(cumsum(randn(100,1)))
subplot(3,2,4), plot(cumsum(randn(100,1)))

% third row
subplot(3,1,3), plot(cumsum(randn(100,1)))

подсюжеты


РЕДАКТИРОВАТЬ:

Используя приведенный вами код, быстрое решение состоит в том, чтобы вручную отрегулировать положение осей для выравнивания.

Сначала вам нужно сохранить дескрипторы всех подзаговоров. Поэтому добавьте в свой скрипт следующее:

figure
h = zeros(1,7);

h(1) = subplot(3,4,1);
% ... [snip] ...

h(2) = subplot(3,4,2);
% ... [snip] ...

% ...

h(7) = subplot(3,4,(9:12));
% ... [snip] ...

Затем вы можете сделать что-то вроде этого:

% positions of axes on the left
positions = cell2mat(get(h([1 5 7]), 'Position'));

% minimum x-position
x = min(positions(:,1));

% set them to be left aligned, and just the width accordingly
for i=[1 5 7]
    pos = get(h(i), 'Position');
    set(h(i), 'Position',[x, pos(2), pos(3) + (pos(1) - x), pos(4)]);
end

Вот результат, который я получаю (я использовал случайные данные RF_data = rand(100,100); для запуска скрипта):

boxplots

person Amro    schedule 26.03.2016
comment
Вы всегда можете иметь полный контроль над позициями осей, установив их свойство Position, как вам нравится. Вам даже не нужно вызывать subplot, просто создайте обычный axes. - person Amro; 26.03.2016
comment
ваш метод не помогает. Я получаю те же участки, с тем же интервалом. Однако, если я скопирую и вставлю ваш код, он будет точно таким же, как вы показываете. - person dSb; 26.03.2016
comment
хорошо, я вижу проблему в вашем коде. Что ж, быстрое решение - схватиться за оси-нарушители и подтолкнуть их позиции, чтобы выровнять их. Дайте мне секунду, я добавлю пример кода. - person Amro; 26.03.2016
comment
Великолепный приятель. Это сработало абсолютно нормально. Огромное спасибо !! - person dSb; 26.03.2016
comment
есть еще проблема, когда я печатаю изображение, высоты подзаголовков меняются, опять же потеря однородности. Не могли бы вы проверить это в своем коде. попробуйте сохранить его, чтобы найти ошибку. - person dSb; 26.03.2016
comment
@Mario назовите это в конце скрипта: set(h,{'Position'}, get(h,'Position')) - person Amro; 26.03.2016
comment
Еще раз спасибо. Я бы все понял, но что делает этот set(h,{'Position'}, get(h,'Position'))? Пожалуйста, объясните это один раз, я сделал после этого. - person dSb; 26.03.2016
comment
Давайте продолжим обсуждение в чате. - person dSb; 26.03.2016