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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:09:04