Создание субплотов в For L oop Matplotlib - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь создать 3,2 подзаговора, используя matplotlib, и я не понимаю, как это сделать после прочтения документации, поскольку это относится к моему коду следующим образом:

import pandas as pd
from sys import exit
import numpy as np
import matplotlib.pyplot as plt
import datetime
import xarray as xr
import cartopy.crs as ccrs
import calendar

list = [0,1,2,3,4,5]
now = datetime.datetime.now()
currm = now.month
import calendar
fig, axes = plt.subplots(nrows=3,ncols=2)
fig.subplots_adjust(hspace=0.5)
fig.suptitle('Teleconnection Pos+ Phases {} 2020'.format(calendar.month_name[currm-1]))
#for x in list: 
#for ax, x in zip(axs.ravel(), list):
for x, ax in enumerate(axes.flatten()):
        dam = DS.where(DS['time.year']==rmax.iloc[x,1]).groupby('time.month').mean()#iterate by index 
of column "1" or the years
        dam = dam.sel(month=3)#current month mean 500
        dam = dam.sel(level=500)
        damc = dam.to_array()
        lats = damc['lat'].data
        lons = damc['lon'].data
#plot data
        ax = plt.axes(projection=ccrs.PlateCarree())
        ax.coastlines(lw=1)
        damc = damc.squeeze()
        ax.contour(lons,lats,damc,cmap='jet')
        ax.set_title(tindices[x])
        plt.show()
#plt.clf()

I ' Я пробовал несколько вариантов, некоторые из которых указаны выше в комментариях, и я не могу отобразить субплоты в 3,2 субплоте, которого я ожидаю. Я получаю только отдельные участки. Я включил первый график в для l oop ниже, поскольку вы можете видеть, что он не нанесен в область 3,2 подплота:

[![enter image description here][1]][1]

Строка с "ax.contour" может быть проблема, но я не уверен. Большое спасибо, и вот мой целевой регион:

[![enter image description here][1]][1]

1 Ответ

1 голос
/ 11 апреля 2020

Без воспроизводимых данных образца, ниже не может быть проверено. Однако ваш l oop назначает новый ax и не использует итерацию ax. Кроме того, plt.show() находится внутри l oop. Рассмотрим приведенную ниже корректировку

for x, ax in enumerate(axes.flatten()):
    ...
    ax = plt.axes(projection=ccrs.PlateCarree())
    ...
    plt.show()

Рассмотрим размещение проекции в plt.subplots, а затем индекс axes в пределах l oop:

fig, axes = plt.subplots(nrows=3, ncols=2, subplot_kw={'projection': ccrs.PlateCarree()})
fig.subplots_adjust(hspace=0.5)
fig.suptitle('Teleconnection Pos+ Phases {} 2020'.format(calendar.month_name[currm-1]))

axes = axes.flatten()

for x, ax in enumerate(axes):
        dam = DS.where(DS['time.year']==rmax.iloc[x,1]).groupby('time.month').mean()

        dam = dam.sel(month=3)#current month mean 500
        dam = dam.sel(level=500)
        damc = dam.to_array()
        lats = damc['lat'].data
        lons = damc['lon'].data

        axes[x].coastlines(lw=1)
        damc = damc.squeeze()
        axes[x].contour(lons, lats, damc, cmap='jet')
        axes[x].set_title(tindices[x])

plt.show() 
plt.clf()
...