MATLAB Подплотове, чертаещи върху цялата площ

Опитвам се да направя ред от 5 графики, използвайки подплотове (така че пет графики един до друг). Въпреки това, когато стартирам кода, първият график просто ще поеме цялата площ на фигурата. Как мога да го стартирам така, че всеки график да остане във всяка област?

Освен това, ако исках всяка година да бъде в различен ред, стил на пощенска марка, с 5 графики във всеки ред, възможно ли е това с помощта на subplot? В момента преглеждам всяка година и запазвам всеки ред от 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'), но съм почти сигурен, че проблемът е в реда, в който изпълнявате тези команди. извикването на subplot вероятно трябва да бъде след командата ax = figure();.   -  person Trogdor    schedule 05.09.2014
comment
Опитах го точно под брадвата = figure(); и не направи нищо.   -  person SugaKookie    schedule 05.09.2014
comment
Използвайте командите 'get' и 'set' с манипулаторите, за да регулирате размера и позицията на всеки подграф. Напишете 'get(hsp(1))', за да видите какви свойства можете да промените. Доста работа обаче.. Успех.   -  person Wooly Jumper    schedule 09.09.2014


Отговори (1)


Както trogdor споменава, странно е първо да се извика subplot. Освен това, използването на figure() вместо действителен номер на фигура (напр. figure(1)) ще го накара да отваря нова фигура всеки път.

Можете да преместите ax = figure(); извън вашия for цикъл. След това извикайте подзаписа, необходим в цикъла. Също така не разбирам защо бихте поставили visible off в първата команда set.

За да отговоря най-накрая на въпроса ви: вярвам, че scatterm(ax,...) използва осите, а не манипулатора на фигурата. След като извикате subplot, трябва да можете да gca за манипулатора на текущата ос или да използвате манипулатора на subplot: 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).


Re. вашият втори въпрос: Използвайте 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
Когато стартирам вашия код с добавен scatterm(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
Добре. Току-що актуализира кода отново. Добавянето на axesm наистина изглежда необходимо, но не разбирам защо. Usamap трябва да създава оси на картата? И по двата начина. Сега работи за мен, мисля, че поставих axesm погрешно от моя m-файл тук последния път. - person Wooly Jumper; 09.09.2014
comment
Бихте ли ми казали дали това работи за вас? Вашето предложение с .jpg би било по-лесно. След като подграфиката стане твърде малка - сблъсквал съм се и с това с цветни ленти - трябва да го персонализирате, като преместите позициите на осите (използвайте команди set и get с дръжките си). Късмет! - person Wooly Jumper; 09.09.2014