Графики MATLAB для всей области

Я пытаюсь сделать ряд из 5 графиков, используя подзаголовки (так что пять графиков рядом друг с другом). Однако, когда я запускаю код, первый график просто занимает всю область фигуры. Как я могу запустить его, чтобы каждый участок оставался в каждой области?

Кроме того, если бы я хотел, чтобы каждый год был в другой строке, в стиле почтовой марки, с 5 графиками в каждой строке, возможно ли это с использованием подзаголовка? Прямо сейчас я просматриваю каждый год и сохраняю каждый ряд из 5 участков в виде отдельного файла jpg.

years = 1997:2014;
for y = 1:numel(years)
    subplot(1,5,1)

    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'});
    geoshow(ax, states,'FaceColor', 'none')
    framem off; gridm off; mlabel off; plabel off

    % Plot data - For each site
    for i = 1:length(uID)
        scatterm(ax, str2double(Lat{i}), str2double(Lon{i}), 40, annual_avg_PM25(i), 'filled'); 
    end

    subplot(1,5,2) 
    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'); % Etc. Same as above

    % Plot data - For each site
    for i = 1:length(uID)
        scatterm(ax, str2double(Lat_Win{i}), str2double(Lon_Win{i}), 40, PM25_Win(i), 'filled');
    end
    % Title
    title(['PM2.5 24-hr Winter (DJF) Seasonal Average ', num2str(years(y)-1), '-', num2str(years(y))]); % Title changes every loop - Year;

    % Etc. Same format for plotting 2 more graphs
    % Save as jpg
    clf
end
close(gcf)

Я получаю это: введите здесь описание изображения

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

Я попробовал следующий код, который отображает подграфики в соответствующих квадрантах, но он искажает размер последнего графика из-за цветовой полосы, а заголовки не ограничиваются квадрантами. Я могу просто настроить размер заголовков, но есть ли более элегантное решение? Кроме того, пустое пространство используется неэффективно.

    years = 1997:2014;
    for y = 1:numel(years)

        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

        %% Annual average PM2.5 concentration
        load(['PM25_24hr_AnnualAvg_' num2str(years(y)) '.mat'], 'annual_avg_PM25', 'Date', 'Lat', 'Lon', 'uID')

        subplot(1,5,1);
        MapLatLimit = [20 50];
        MapLonLimit = [-135.5 -44];
        usamaps = shaperead('usastatelo', 'UseGeoCoords', true, ...
            'BoundingBox', [MapLonLimit' MapLatLimit']);
        ax = axesm('MapProjection', 'eqaconic', 'MapParallels', [],...
            'MapLatLimit', MapLatLimit, 'MapLonLimit', MapLonLimit,...
            'GLineStyle', '-');
        geoshow(usamaps, 'DisplayType', 'polygon', 'FaceColor','none')
        framem off; gridm off; mlabel off; plabel off

        % Title
        title(['Annual Average ', num2str(years(y))]); % Title changes every loop - Year;

        % Plot data - For each site
        for i = 1:length(uID)
            scatterm(ax, str2double(Lat{i}), str2double(Lon{i}), 40, annual_avg_PM25(i), 'filled'); 
        end

        clear('uID', 'annual_avg_PM25', 'Lat', 'Lon')

        %% Plot all the other ones in the same fashion except for the last plot, which adds a colorbar
                %% Fall Seasonal Average
        load(['PM25_24hr_FallAvg_' num2str(years(y)) '.mat'], 'annual_avg_PM25', 'Date', 'Lat', 'Lon', 'uID')

        subplot(1,5,5);
        MapLatLimit = [20 50];
        MapLonLimit = [-135.5 -44];
        usamaps = shaperead('usastatelo', 'UseGeoCoords', true, ...
            'BoundingBox', [MapLonLimit' MapLatLimit']);
        ax = axesm('MapProjection', 'eqaconic', 'MapParallels', [],...
            'MapLatLimit', MapLatLimit, 'MapLonLimit', MapLonLimit,...
            'GLineStyle', '-');
        geoshow(usamaps, 'DisplayType', 'polygon', 'FaceColor','none')
        framem off; gridm off; mlabel off; plabel off

        % Plot data - For each site
        for i = 1:length(uID)
            scatterm(ax, str2double(str2double(Lat{i})), str2double(str2double(Lon{i})), 40, annual_avg_PM25(i), 'filled'); % Plot a dot at each Lat and Lon
        end

        % Colorbar
        caxis([5 12])
        h = colorbar; %('location', 'OutsideEast');
        ylabel(h,'Concentration (ug/m3)');

        % Title
        title(['Fall (SON) Average ', num2str(years(y))]); % Title changes every loop - Year;

        % Save as jpg
        eval(['print -djpeg map_US_' num2str(years(y)) '_Subplot_AnnualSeasonalAvg_PM25_24hr.jpg']);
        clf
    end
end

Это изображение, которое я получаю: введите описание изображения здесь


person SugaKookie    schedule 05.09.2014    source источник
comment
Я не могу точно запустить ваш код (неопределенная переменная «uID»), но я почти уверен, что проблема заключается в том порядке, в котором вы запускаете эти команды. вызов подзаголовка, вероятно, должен быть после команды ax = figure();.   -  person Trogdor    schedule 05.09.2014
comment
Я пробовал прямо под топором = figure(); и это ничего не сделало.   -  person SugaKookie    schedule 05.09.2014
comment
Используйте команды «получить» и «установить» с маркерами, чтобы настроить размер и положение каждого подграфика. Введите «get(hsp(1))», чтобы увидеть, какие свойства вы можете изменить. Хотя довольно много работы.. Удачи.   -  person Wooly Jumper    schedule 09.09.2014


Ответы (1)


Как упоминает Трогдор, странно сначала вызывать сюжет. Кроме того, использование figure() вместо фактического номера фигуры (например, figure(1)) заставит каждый раз открывать новую фигуру.

Вы можете переместить ax = figure(); за пределы цикла for. Затем вызовите подзаголовок, необходимый в цикле. Я также не понимаю, почему вы отключили видимость в первой команде set.

Чтобы, наконец, ответить на ваш вопрос: я считаю, что scatter(ax,...) использует оси, а не дескриптор фигуры. После вызова подзаголовка вы должны иметь возможность gca для текущего дескриптора оси или использовать дескриптор подзаголовка: hsp = subplot(..)


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

for lp = 1:10
   subplot(2,5,lp);
   hma(lp)=axesm('MapProjection','robinson',...
    'Frame','off','Grid','on');
   usamap('conus');
   states = shaperead('usastatelo', 'UseGeoCoords', true,...
        'Selector',...
        {@(name) ~any(strcmp(name,{'Alaska','Hawaii'})), 'Name'});
    geoshow(hma(lp), states,'FaceColor', 'none')
    framem off; gridm off; mlabel off; plabel off
    scatterm(hma(lp), [1 2], [1 2], 40, [1 2], 'filled');
end

p.s. вы не хотите закрывать текущую фигуру, удалите close(gcf).


Ре. ваш второй вопрос: используйте subplot(2,5,2), чтобы получить подзаголовок из 2 строк и 5 столбцов. Нумерация идет сначала по столбцам, потом по строкам. т. е. subplot(2,5,1:5) — ваша верхняя строка, subplot(2,5,6:10) — вторая строка.

person Wooly Jumper    schedule 05.09.2014
comment
Я поставил ax = figure(1) вне цикла и только там. Я использовал hsp = subplot(...) везде, где у меня был subplot(...). Но мне просто нечего показывать. - person SugaKookie; 05.09.2014
comment
Извините за задержку с ответом. Ваш код как есть работает, но когда я попробовал то, что у вас было выше, поставив scatterm(hsp(lp), ... после framem off, я получаю эту ошибку: Error using gcm (line 26) Not a map axes. Error in scatterm (line 49) gcm(ax); - person SugaKookie; 08.09.2014
comment
Когда я запускаю ваш код с добавлением scatter(hsp(lp)...), он выдает ошибку, о которой я говорил выше. Значит, что-то не так с этой частью. Я добавил редактирование к своему вопросу, чтобы отразить то, что я пытался, и поместил ссылку на файлы .mat, которые я использовал, чтобы вы могли проверить это сами. - person SugaKookie; 08.09.2014
comment
Эй, извините, но я понял, что, хотя оси рисовали (5 в одном ряду), как я хотел, сама карта США не отображалась. Ты знаешь почему? Кроме того, у кода, похоже, есть проблемы с графиком более одного года. Он просто застревает на пустом месте после появления первых 5 осей. Я не знаю, связано ли это с наличием figure и set(ax...) снаружи. - person SugaKookie; 09.09.2014
comment
Приведенное выше редактирование заканчивается тем, что карта США снова отображается по всему изображению с небольшим графиком осей XY с левой стороны. - person SugaKookie; 09.09.2014
comment
Я попробовал код (выше под EDIT), который отображает подграфики, но он сжимает последний график из-за цветовой полосы и не содержит заголовков на графиках. Мне интересно, будет ли проще читать файлы jpg каждого сюжета (которые у меня уже есть) и размещать их рядом друг с другом. Еще не было возможности в этом разобраться. - person SugaKookie; 09.09.2014
comment
Хорошо. Только что обновил код еще раз. Добавление оси кажется необходимым, но я не понимаю, почему. Usamap должен создавать оси карты? Так или иначе. Теперь это работает для меня, я считаю, что в прошлый раз я неправильно вставил axesm из моего m-файла сюда. - person Wooly Jumper; 09.09.2014
comment
Не могли бы вы сообщить мне, работает ли это для вас? Ваше предложение с .jpg было бы проще. Как только подзаговор становится слишком маленьким — я столкнулся с этим и с цветными полосами — вам нужно настроить его, перемещая позиции осей (используйте команды set и get с вашими ручками). Удачи! - person Wooly Jumper; 09.09.2014