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

使用matplotlib contourf绘制密度数组及叠加Basemap海岸线问题

解决Basemap叠加等值图及后续调整问题

核心问题分析

直接用plt.contourf绘制的是笛卡尔坐标系下的图形,初始化Basemap后会修改当前轴的投影属性,导致原等值图因投影不匹配消失;使用m.contourf出错,大多是因为未生成与数据维度匹配的二维经纬度网格,或经纬度/数据维度不对应。

完整解决方案代码

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
import xarray as xr

# 提取最后一个时间步的密度数据
density_last = dens.density.isel(time=-1).values
# 生成与数据维度匹配的二维经纬度网格
lon_grid, lat_grid = np.meshgrid(dens.lon.values, dens.lat.values)

# 扩大显示区域:基于数据的经纬度范围向外扩展10度(可自行调整幅度)
lon_min = dens.lon.min().values - 10
lon_max = dens.lon.max().values + 10
lat_min = dens.lat.min().values - 10
lat_max = dens.lat.max().values + 10

# 初始化Basemap,选择圆柱投影(可根据需求更换其他投影)
m = Basemap(llcrnrlon=lon_min, llcrnrlat=lat_min,
            urcrnrlon=lon_max, urcrnrlat=lat_max,
            projection='cyl', resolution='l')

# 将经纬度转换为Basemap投影坐标(非圆柱投影必须执行此步骤)
x, y = m(lon_grid, lat_grid)

# 绘制等值填充图
cs = m.contourf(x, y, density_last, cmap='viridis')

# 设置陆地为灰色,绘制海岸线
m.drawcoastlines(linewidth=1.2)
m.fillcontinents(color='gray', lake_color='white')

# 添加色标和标题
plt.colorbar(cs, label='Density')
plt.title('Last Time Step Density')
plt.show()

常见错误排查

  • TypeError:检查是否将一维的lon/lat通过np.meshgrid转换为二维网格,确保density_last、lon_grid、lat_grid维度均为(30,30)
  • IndexError:确认数据切片正确(dens.density.isel(time=-1)确实返回(30,30)的数组),np.meshgrid输入顺序为(lon, lat),对应数据的(lat, lon)维度(meshgrid生成的网格维度与数据维度匹配)

内容的提问来源于stack exchange,提问作者Yotam Ben Saadon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:40:08