Подзаголовок MATLAB не остается на одной стороне страницы

Я пытаюсь построить две карты бок о бок, используя subplot. Однако вместо того, чтобы отображать графики рядом друг с другом, я просто получаю одну карту (вторую, которую я пытался построить), покрывающую всю страницу. Нравится:

введите описание изображения здесь

Я хочу, чтобы верхний график представлял собой одну карту, которая будет выглядеть так же, как изображение выше, но с другой шкалой цвета, заголовком и т. Д. И затем нижний график. Это изображение также обрезает цветовую полосу, и оси не должны быть помечены таким образом. Вот пример того, как я бы хотел, чтобы он выглядел на основе того, что я сделал ранее для небольшой территории США. введите описание изображения здесь

Я бы хотел, чтобы они на самом деле были рядом, поэтому я отредактировал код, чтобы сделать это (я пробовал вверх и вниз, чтобы увидеть, решит ли это проблему)

Вот код, который я использовал. Данные, которые я загружаю, можно найти здесь: https://www.dropbox.com/sh/k55y0g2kv9w7gv8/AADBBE9Qc1M-C7YiRL3SnC4ja

%% Load data needed for mapping
load map_PM25.mat
load map_O3.mat

nFrames = 6240; 
for k = 94:nFrames 
    subplot(1,2,1) % PM2.5

    % Map of conterminous US
    ax = figure(1);
    set(ax, 'visible', 'off', 'units','normalized','outerposition',[0 0 1 1]); %  Make window that shows up full sized, which makes saved figure clearer

    ax = usamap('conus');
    states = shaperead('usastatelo', 'UseGeoCoords', true,...
        'Selector',...
        {@(name) ~any(strcmp(name,{'Alaska','Hawaii'})), 'Name'});
    faceColors = makesymbolspec('Polygon',...
        {'INDEX', [1 numel(states)], 'FaceColor', 'none'}); % NOTE - colors are random
    geoshow(ax, states, 'DisplayType', 'polygon', ...
        'SymbolSpec', faceColors)
    framem off; gridm off; mlabel off; plabel off

    hold on

    % Plot data
    scatterm(ax,str2double(Lat_PM25{k})', str2double(Lon_PM25{k})', 40, str2double(data_PM25{k})', 'filled'); 

    hold on

    % Colorbar
    caxis([5 30]);
    h = colorbar;
    ylabel(h,'ug/m3');

    % Title
    title(['PM2.5 24-hr Concentration ', datestr(cell2mat(date_PM25(k)), 'mmm dd yyyy')]); 

    subplot(1,2,2) % O3
    % Map of conterminous US
    ax = figure(1);
    set(ax, 'visible', 'on', 'units','normalized','outerposition',[0 0 1 1]); %  Make window that shows up full sized, which makes saved figure clearer

    ax = usamap('conus');
    states = shaperead('usastatelo', 'UseGeoCoords', true,...
        'Selector',...
        {@(name) ~any(strcmp(name,{'Alaska','Hawaii'})), 'Name'});
    faceColors = makesymbolspec('Polygon',...
        {'INDEX', [1 numel(states)], 'FaceColor', 'none'}); % NOTE - colors are random
    geoshow(ax, states, 'DisplayType', 'polygon', ...
        'SymbolSpec', faceColors)
    framem off; gridm off; mlabel off; plabel off

    hold on

    % Plot data 
    scatterm(ax,str2double(Lat_O3{k})', str2double(Lon_O3{k})', 40, str2double(data_O3{k})'*1000, 'filled'); % Plot a dot at each Lat and Lon

    hold on

    % Colorbar 
    caxis([10 90]);
    h = colorbar;
    ylabel(h,'ppb');

    % Title
    title(['O3 MDA8 Concentration ', datestr(cell2mat(date_O3(k)), 'mmm dd yyyy')]); % Title changes every daytitle(str);

    % Capture the frame
    mov(k) = getframe(gcf); % Makes figure window pop up

    % Save as jpg 
    eval(['print -djpeg map_US_' datestr(cell2mat(date_PM25(k)),'yyyy_mm_dd') '_PM25_24hr_O3_MDA8.jpg']);

    clf

end

close(gcf)

person SugaKookie    schedule 22.05.2014    source источник
comment
Что делает usamap('conus') и что возвращает?   -  person shimizu    schedule 23.05.2014
comment
Я взял это из примера Mathwork по картированию. Он отображает прилегающие Соединенные Штаты.   -  person SugaKookie    schedule 23.05.2014


Ответы (2)


Проблема в том, что usamap не позволяет вам строить в текущих осях (в данном случае, в ваших осях подзаголовка). См. это обсуждение на форумах MATLAB.

Основной обходной путь - построить usamap, получить оси для этой карты и поместить ее в положение осей подзаголовка. В следующем коде usamap отображается рядом, как вы хотели бы:

h11 = subplot(1,2,1);
ax = usamap('conus');
set(ax,'Position',get(h11,'Position'));
delete(h11);

h22 = subplot(1,2,2);
ax2 = usamap('conus');
set(ax2,'Position',get(h22,'Position'));
delete(h22);
person shimizu    schedule 22.05.2014
comment
Можете ли вы опубликовать свой измененный код и удалить посторонние части и комментарии - только минимум для воспроизведения проблемы? Это было бы полезно для отладки. - person shimizu; 23.05.2014

Хотя я не уверен, но думаю, что одновременное использование subplot(1,2,1) и set(ax, 'visible', 'off', 'units','normalized','outerposition',[0 0 1 1]); проблематично. Второе утверждение, как мне кажется, работает для всей фигуры, а не для конкретного подзаговора, возможно, поэтому вторая фигура перекрывает первую в полном размере [0 0 1 1].

вот мой код для этого.

a=1:5;
b=1:5;

figure('units','normalized','outerposition',[0 0 1 1]); % this makes figure full size
subplot('position',[0.05 0.05 0.45 0.9]); % specifying the position and dimensions of each subplot
% notice i have left some space between the subplots 
plot(a,b);
subplot('position',[0.55 0.05 0.45 0.9]); % 2nd subplot
plot(a,b);

вы также можете написать цикл,

posx=0.05; % x position of first subplot
for i=1:3
    subplot('position',[posx 0.05 0.25 0.9]);
    posx=posx+0.3; % this is little bit greater than x dimension 0.25 of subplot 
    % to leave space between subplots
    plot(a,b);
end
person Guddu    schedule 22.05.2014
comment
Когда вы пишете subplot('position',[0.05 0.05 0.45 0.9]); , вы не указываете, какой сюжет. Это нормально? Я добавил его после обоих своих set(ax,..., но получаю тот же результат - person SugaKookie; 23.05.2014
comment
я думаю, что Matlab инициализирует подзаголовок каждый раз, когда я пишу subplot('position'…); - person Guddu; 23.05.2014
comment
не используйте set(ax… попробуйте запустить коды, которые я написал в своем ответе. - person Guddu; 23.05.2014