为了账号安全,请及时绑定邮箱和手机立即绑定

在 For 循环 Matplotlib 中创建子图

在 For 循环 Matplotlib 中创建子图

catspeake 2022-10-05 17:51:04
我正在尝试使用 matplotlib 制作 3,2 子图,但在阅读文档后我不明白如何执行此操作,因为它适用于我的代码,如下所示:import pandas as pdfrom sys import exitimport numpy as npimport matplotlib.pyplot as pltimport datetimeimport xarray as xrimport cartopy.crs as ccrsimport calendarlist = [0,1,2,3,4,5]now = datetime.datetime.now()currm = now.monthimport calendarfig, 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()我已经尝试了多个选项,其中一些在评论上方,我无法让子图显示在我期待的 3,2 子图中。我只得到单个地块。我在下面的 for 循环中包含了第一个图,您可以看到它没有绘制在 3,2 子图区域内:[![enter image description here][1]][1]带有“ax.contour”的行可能是问题,但我不确定。非常感谢,下面是我的目标子图区域:[![enter image description here][1]][1]
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

没有可重现的样本数据,以下无法进行测试。但是,您的循环分配了一个新的ax并且不使用ax正在迭代的对象。此外,plt.show()被放置在循环内。考虑以下调整


for x, ax in enumerate(axes.flatten()):

    ...

    ax = plt.axes(projection=ccrs.PlateCarree())

    ...

    plt.show()

考虑将投影放在循环内的plt.subplots然后索引中:axes


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()


查看完整回答
反对 回复 2022-10-05
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信