使用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
相关产品推荐
相关产品推荐

