在 For Loop Matplotlib 中创建子图
Create Subplots in For Loop Matplotlib
我正在尝试使用 matplotlib 制作一个 3,2 子图,但在阅读文档后我不明白如何执行此操作,因为它适用于我的代码如下:
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()
我已经尝试了多个选项,其中一些在上面的评论中,但我无法让子图显示在我期待的 3,2 子图中。我只得到单个地块。我在下面的 for 循环中包含了第一个图,因为您可以看到它没有绘制在 3,2 子图区域内:
[![enter image description here][1]][1]
"ax.contour" 行可能是问题所在,但我不确定。非常感谢,下面是我的目标子图区域:
[![enter image description here][1]][1]
没有可重现的示例数据,无法测试以下内容。但是,您的循环分配了一个新的 ax
并且不使用正在迭代的 ax
。此外,plt.show()
被放置在循环中。考虑以下调整
for x, ax in enumerate(axes.flatten()):
...
ax = plt.axes(projection=ccrs.PlateCarree())
...
plt.show()
考虑在 plt.subplots
中放置 projection,然后在循环中索引 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()
我正在尝试使用 matplotlib 制作一个 3,2 子图,但在阅读文档后我不明白如何执行此操作,因为它适用于我的代码如下:
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()
我已经尝试了多个选项,其中一些在上面的评论中,但我无法让子图显示在我期待的 3,2 子图中。我只得到单个地块。我在下面的 for 循环中包含了第一个图,因为您可以看到它没有绘制在 3,2 子图区域内:
[![enter image description here][1]][1]
"ax.contour" 行可能是问题所在,但我不确定。非常感谢,下面是我的目标子图区域:
[![enter image description here][1]][1]
没有可重现的示例数据,无法测试以下内容。但是,您的循环分配了一个新的 ax
并且不使用正在迭代的 ax
。此外,plt.show()
被放置在循环中。考虑以下调整
for x, ax in enumerate(axes.flatten()):
...
ax = plt.axes(projection=ccrs.PlateCarree())
...
plt.show()
考虑在 plt.subplots
中放置 projection,然后在循环中索引 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()