Python Matplotlib子图如何在数据上叠加等高线及解决ax多值报错
问题解答
1. 基础支持性确认
Python的Matplotlib库完全支持在已绘制的数据图层上方叠加等高线,你之前单图绘制的可行结果也已经验证了这一点。
2. 报错原因分析
你遇到的TypeError: inner() got multiple values for argument 'ax'报错,核心原因是xarray的plot方法和子图模式下的轴传参逻辑冲突:
- 单图模式下,调用
salt_ocean1.plot()时如果不指定ax参数,方法会自动创建子图并返回绘图对象,不会出错 - 多子图模式下,你大概率是预先创建了子图轴数组,然后把轴对象传给了plot方法,同时又保留了
subplot_kws参数,就会导致重复传入ax相关参数触发报错
3. 多子图叠加等高线的正确实现方案
步骤1:预先创建子图数组
先一次性创建7个子图,指定投影,避免xarray自动创建轴时的参数冲突:
import xarray as xa import numpy as np import matplotlib.pyplot as plt import cmocean.cm as cm import cartopy.crs as ccrs map_proj = ccrs.PlateCarree(central_longitude = 6) # 创建7个子图,可根据需求调整行列数、画布尺寸 fig, axs = plt.subplots(nrows=1, ncols=7, figsize=(21,3), subplot_kw={'projection': map_proj})
步骤2:循环绘制每组数据+等高线
遍历每个子图轴,分别绘制盐度数据和等高线,需要注意:
- 给xarray的plot方法明确指定
ax参数 - 等高线绘制也指定当前的子图轴,同时传入transform参数匹配投影
- 统一设置colorbar,避免每个子图重复显示
# 假设你有7组盐度数据存在salt_ocean_list列表里,等高线数据如果每组不同也对应存入列表即可 for i, ax in enumerate(axs): # 绘制盐度数据,指定当前子图ax salt_plot = salt_ocean_list[i].plot( ax=ax, transform = ccrs.PlateCarree(), cmap = cm.haline, add_colorbar=False ) # 叠加等高线,指定ax和投影参数 contour = ax.contour( xp, yp, zp, transform=ccrs.PlateCarree(), colors='white' # 可自定义等高线颜色提升辨识度 ) # 可选:添加等高线数值标注 ax.clabel(contour, inline=True, fontsize=8) ax.set_title(f'模型运行结果 {i+1}') # 统一添加共享colorbar fig.colorbar(salt_plot, ax=axs, location='bottom', shrink=0.8, label='盐度') plt.tight_layout() plt.show()
4. 单图示例代码修正
你提供的单图代码存在小问题:xarray的DataArray.plot()返回的是QuadMesh对象不是轴对象,应该用plt.gca()获取当前轴,修正后如下:
# 单图绘制修正版 map_proj = ccrs.PlateCarree(central_longitude = 6) salt_ocean1.plot( transform = ccrs.PlateCarree(), subplot_kws={"projection":map_proj}, cmap = cm.haline, add_colorbar=False ) ax = plt.gca() # 获取当前轴对象 # 等高线绘制指定transform和轴 contour = ax.contour(xp, yp, zp, transform=ccrs.PlateCarree(), colors='white') ax.clabel(contour, inline=True) plt.colorbar(label='盐度') plt.show()
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

