Как я могу изменить свои позиции подзаговора, чтобы они не перезаписывали друг друга? - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь создать участок (6 участков) карт мира, в который я пишу выбранные шейп-файлы. Моя проблема с моим размещением участков: они перезаписывают друг друга. Из других вопросов, подобных этому в stackoverflow, я понимаю, что это потому, что оси как-то перекрываются. Но я думал, что создал позиции, которые будут просто «рядом» (см. Код ниже). Я пытался сделать оси прозрачными, и это, похоже, не помогает. Мой вопрос: как я могу изменить положения графика, чтобы они не перезаписывали друг друга?

Код, который я использую (со снятым материалом шейп-файла):

clc;
clear all;
%First create the positions for the subplots
handle1=subplot(3,2,1);
H1=get(handle1,'position');
h1pos=H1+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h1pos)
hold all

handle2=subplot(3,2,2);
H2=get(handle2,'position');
h2pos=H2+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h2pos)

handle3=subplot(3,2,3);
H3=get(handle3,'position');
h3pos=H3+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h3pos)

handle4=subplot(3,2,4);
H4=get(handle4,'position');
h4pos=H4+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h4pos)

handle5=subplot(3,2,5);
H5=get(handle5,'position');
h5pos=H5+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h5pos)

handle6=subplot(3,2,6);
H6=get(handle6,'position');
h6pos=H6+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h6pos)

subplot(3,2,1,'Position',h1pos)
text(0.02,0.98,'(a)','Units', 'Normalized', 'VerticalAlignment', 'Top');
%handle1=subplot(2,2,1);
%H1=get(handle1,'position');
%h1pos=H1+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h1pos)
h=worldmap('world')
%     borders('countries', 'Color', 'black')

subplot(3,2,2,'Position',h2pos)
text(0.02,0.98,'(b)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 

subplot(3,2,3,'Position',h3pos)
text(0.02,0.98,'(c)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 

subplot(3,2,4,'Position',h4pos)
text(0.02,0.98,'(d)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 

subplot(3,2,5,'Position',h5pos)
text(0.02,0.98,'(e)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')

subplot(3,2,6,'Position',h6pos)
text(0.02,0.98,'(f)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 
%     borders('countries', 'Color', 'black') 

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Вектор position MATLAB определяется как [left bottom width height], и в вашем случае, если вы посмотрите на h1pos и h3pos, они равны

h1pos = [0.0300    0.6093    0.4347    0.3157]
h3pos = [0.0300    0.3096    0.4347    0.3157]

h1pos(2) - h3pos(2) = 0.2996 < 0.3157, т.е. расстояние между осями равно меньше, чем высота вашего h1, и в результате происходит наложение, которое приводит к «подзаговору», удаляющему ваши оси.

Чтобы решить эту проблему, вы можете более тщательно рассчитать свои позиции и либо оставить больше места, либо уменьшить высоту (при уменьшении высоты до 0,05 будет работать). Вы можете изменить свойство position, просто выполнив что-то вроде handle6.Position = [0.0300 0.3096 0.4347 0.3157];

PS, которое вы могли бы улучшить своим стилем кодирования, уменьшив некоторую избыточность. Вот фрагмент кода, который сделает эту работу

offset = [-0.05,-0.05,0.1,0.05];
pos = zeros(6, 4);

for ii = 1:6
    h = subplot(3,2,ii);
    pos(ii, :) = h.Position;
end

for ii = 1:6
    subplot('Position',pos(ii,:) + offset);
    text(0.02,0.98,['(' char('a'+ii-1) ')'],'Units', 'Normalized', 'VerticalAlignment', 'Top');
    h=worldmap('world');
end
1 голос
/ 24 февраля 2020

subplot сам по себе создаст оси, которые не перекрываются, но удалит все существующие оси, которые перекрываются. Поэтому сначала поставьте шесть вызовов subplot и поменяйте их позиции в конце. Используйте set(handle1,'Position',h1pos), а не subplot(...), чтобы изменить положение. Вы также можете использовать axes для создания объекта осей без удаления существующих перекрывающихся осей. Так как вы все равно устанавливаете положение вручную, команда subplot не имеет для вас никаких преимуществ.

Вы также можете рассмотреть возможность использования новой функциональности tiledlayout.

...