如何在tricontourf绘图中屏蔽缺失数据并解决Qhull三角剖分报错
问题根因
- 重采样后保留了全NaN行,填充0后引入了大量坐标为0/NaN的无效点位,Delaunay三角剖分时输入坐标存在冲突,触发qhull报错
- 基于包含无效点位的坐标生成三角网,即使后续遮罩z值为0的三角形,也会因为无效点拉偏三角网形状,出现绘图伪影
- 直接删除NaN行后
tricontourf会自动外插填充凸包范围内的区域,所以看起来像是填充了缺失数据区
修复方案
步骤1:预处理过滤无效数据
重采样后直接删除TEC列为空的行,不要保留全空行填充0,从源头移除无效坐标点。
步骤2:优化三角网遮罩逻辑
仅用有效数据生成三角网,额外使用TriAnalyzer过滤拉伸比例过大的扁平三角形,避免跨空缺区域的异常三角面,配合z值遮罩完全屏蔽无效区域。
修复后代码
import matplotlib.pyplot as plt import numpy as np import matplotlib.tri as tri fig, ax = plt.subplots() dy = devstns[0] # 重采样为小时粒度 dy = dy.resample("H", base=1).mean() # 提取日期和年积日 dy["date"] = dy.index dy["doy"] = dy["date"].apply(lambda x: x.timetuple().tm_yday) # 直接删除TEC、坐标为空的行,不要填充0 dy = dy.dropna(subset=["TEC", "doy", "UT"]) # 提取有效坐标和值 x = dy.doy.values y = dy.UT.values z = dy.TEC.values # 生成三角网 triang = tri.Triangulation(x, y) # 过滤拉伸过大的扁平三角形,避免跨空缺区域的伪影 tri_analyzer = tri.TriAnalyzer(triang) flat_mask = tri_analyzer.get_flat_tri_mask(min_circle_ratio=0.01) triang.set_mask(flat_mask) # 绘制等高线,z值的NaN会自动被处理为透明 colplt = ax.tricontourf(triang, z) # 设置画布背景为白色,缺失区域自然显示为白色 ax.set_facecolor("white") plt.colorbar(colplt, ax=ax) plt.show()
补充说明
如果需要严格限制绘图范围只在有数据的区域,可以额外计算有效数据的凸包,将凸包外的区域用白色矩形覆盖,或者手动设置x/y轴的显示范围匹配有效数据的最大最小doy和UT值。
内容的提问来源于stack exchange,提问作者LordHammer
相关产品推荐
相关产品推荐

