使用Python cartopy绘制地图时如何调整contourf影线的疏密程度
解决方案
核心方法:调整matplotlib影线专属配置参数
不需要缩放画布,直接通过matplotlib的影线专属参数调整密度和线宽,不会影响文本、海岸线等其他元素的样式。
方法1:全局设置(所有影线统一生效)
在绘图代码开头加入如下配置,核心是hatch.density参数,数值越大影线越密集,默认值为1:
import matplotlib as mpl # 调整影线密度,数值越大越密,可根据需求调整 mpl.rcParams['hatch.density'] = 6 # 可选:调整影线本身的粗细,数值越小线越细 mpl.rcParams['hatch.linewidth'] = 0.4
你的代码加入上述配置后,不需要修改画布尺寸即可得到高密度的影线效果。
方法2:仅调整当前显著性区域的影线(不影响其他绘图元素)
如果不想修改全局配置,可以单独获取contourf返回的集合对象,针对性设置属性:
# 把绘制显著性影线的contourf返回值赋值给变量 cf_sig = ax.contourf( lons, lats, data > data.mean(), transform=ccrs.PlateCarree(), colors='none', levels=[.5, 1.5], hatches='///', ) # 单独修改这组影线的属性 for col in cf_sig.collections: col.set_hatch_density(6) col.set_hatch_linewidth(0.4)
低版本matplotlib兼容方法
如果你的matplotlib版本低于3.3,不支持hatch.density参数,可以通过重复影线符号的方式提升密度,比如把hatches='///'改成hatches='////////////////////',重复的字符越多,影线越密。
完整可运行示例
import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import cartopy.crs as ccrs # 调整影线参数 mpl.rcParams['hatch.density'] = 6 mpl.rcParams['hatch.linewidth'] = 0.4 lats = np.arange(-90, 91, 10) lons = np.arange(-180, 181, 20) data = np.sin(np.arange(len(lats)*len(lons))).reshape(len(lats), len(lons)) proj = ccrs.Robinson() fig, ax = plt.subplots(figsize=(6, 7), subplot_kw={'projection': proj}) im = ax.contourf( lons, lats, data, transform=ccrs.PlateCarree(), ) ax.contourf( lons, lats, data > data.mean(), transform=ccrs.PlateCarree(), colors='none', levels=[.5, 1.5], hatches='///', ) ax.coastlines() ax.set_global() cbar = fig.colorbar(im, ax=ax, location='bottom') # 保存图片时设置高dpi可避免影线显示模糊 # plt.savefig('sig_map.png', dpi=300, bbox_inches='tight') plt.show()
补充说明
你之前通过缩放画布调整影线密度的方法不可行,是因为matplotlib的所有元素尺寸(字体大小、线宽等)都是基于英寸单位设置的,画布放大后所有元素都会等比例缩放,导致样式异常。使用上述影线专属参数调整的方法,完全不会影响其他元素的样式。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

