如何解决我有 12 张使用 cartopy 的地图,我想使用 plt.subplots 制作地图的网格显示4 行 3 列
我有 12 张 cartopy 地图,我想将它们组织成 3 行 4 列,以便更容易看到它们,而不仅仅是垂直绘制。 我尝试使用 fig,ax = plt.subplots 并使用 ax.ravel 但我不断收到此错误。我也尝试更新cartopy,但错误仍然存在:
fig,ax = plt.subplots(nrows=3,ncols=4,figsize=(15,5))
for i in zip(range(12),ax.ravel()):
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([-90,10,5,85],crs=ccrs.PlateCarree())
x = ax.contourf(longitude,latitude,climatology[i],np.arange(28,39,.3),cmap='jet',ax=ax,extend='both')
ax.coastlines()
#ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
gridlines = ax.gridlines(draw_labels=True)
cbar = plt.colorbar(x,fraction=.046,pad=0.04)
cbar.set_label('psu',labelpad=15,y=.5,rotation=90)
ax.text(.5,-.12,'Longitude',va='bottom',ha='center',rotation='horizontal',rotation_mode= 'anchor',transform=ax.transAxes)
ax.text(-.1,.5,'Latitude',rotation='vertical',transform=ax.transAxes)
#plt.title(title)
plt.show()
错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-57-4fa6b08f3ee5> in <module>
3 ax = plt.axes(projection=ccrs.PlateCarree())
4 ax.set_extent([-90,crs=ccrs.PlateCarree())
----> 5 x = ax.contourf(sss_md.longitude,sss_md.latitude,extend='both')
6 ax.coastlines()
7 #ax.add_feature(cfeature.LAND,edgecolor='k')
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/dataarray.py in __getitem__(self,key)
640 else:
641 # xarray-style array indexing
--> 642 return self.isel(indexers=self._item_key_to_dict(key))
643
644 def __setitem__(self,key: Any,value: Any) -> None:
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/dataarray.py in isel(self,indexers,drop,missing_dims,**indexers_kwargs)
1037
1038 if any(is_fancy_indexer(idx) for idx in indexers.values()):
-> 1039 ds = self._to_temp_dataset()._isel_fancy(
1040 indexers,drop=drop,missing_dims=missing_dims
1041 )
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/dataset.py in _isel_fancy(self,missing_dims)
2011
2012 if name in self.indexes:
-> 2013 new_var,new_index = isel_variable_and_index(
2014 name,var,self.indexes[name],var_indexers
2015 )
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/indexes.py in isel_variable_and_index(name,variable,index,indexers)
104 )
105
--> 106 new_variable = variable.isel(indexers)
107
108 if new_variable.dims != (name,):
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/variable.py in isel(self,**indexers_kwargs)
1116
1117 key = tuple(indexers.get(dim,slice(None)) for dim in self.dims)
-> 1118 return self[key]
1119
1120 def squeeze(self,dim=None):
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/variable.py in __getitem__(self,key)
764 array `x.values` directly.
765 """
--> 766 dims,indexer,new_order = self._broadcast_indexes(key)
767 data = as_indexable(self._data)[indexer]
768 if new_order:
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/variable.py in _broadcast_indexes(self,key)
610 # key can be mapped as an OuterIndexer.
611 if all(not isinstance(k,Variable) for k in key):
--> 612 return self._broadcast_indexes_outer(key)
613
614 # If all key is 1-dimensional and there are no duplicate labels,~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/variable.py in _broadcast_indexes_outer(self,key)
686 new_key.append(k)
687
--> 688 return dims,OuterIndexer(tuple(new_key)),None
689
690 def _nonzero(self):
~/miniconda3/envs/py3_std_maps/lib/python3.8/site-packages/xarray/core/indexing.py in __init__(self,key)
407 elif isinstance(k,np.ndarray):
408 if not np.issubdtype(k.dtype,np.integer):
--> 409 raise TypeError(
410 f"invalid indexer array,does not have integer dtype: {k!r}"
411 )
TypeError: invalid indexer array,does not have integer dtype: array(<AxesSubplot:>,dtype=object)
解决方法
试试这个编辑过的代码。请注意,投影应声明为 subplot_kw
的一部分。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
fig,axes = plt.subplots(nrows=3,ncols=4,figsize=(18,10),subplot_kw=dict(projection=ccrs.PlateCarree()))
for i,ax in zip(range(12),axes.ravel()):
# (or) for i,ax in enumerate(axes.flat):
# (NOT this) ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([-90,10,5,85],crs=ccrs.PlateCarree())
ax.coastlines(lw=0.2)
# (plot land) ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
gridlines = ax.gridlines(draw_labels=True)
# cbar = plt.colorbar(x,fraction=.046,pad=0.04)
# cbar.set_label('psu',labelpad=15,y=.5,rotation=90)
ax.text(.5,-.12,'Longitude',va='bottom',ha='center',rotation='horizontal',rotation_mode= 'anchor',transform=ax.transAxes)
ax.text(-.1,.5,'Latitude',rotation='vertical',transform=ax.transAxes)
# plt.title(title)
plt.show() # place this outside the `for-loop`
输出图:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。