You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:36:01