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

如何解决plt.Tricontour绘制线条超出给定数据范围的问题?

问题描述

我尝试用plt.tricontour绘制三维数据的等值线图,提供的数据仅覆盖到黑色线条以内的区域,但绘制出的等值线却超出该线条,延伸到了数据范围之外。

所用数据为X、Y、Z三个数组,数据文件可通过Google Drive获取(文件ID:19CGMX3qDBCbGU2D2uL0ehPGTrOmxtLHP)。

当前使用的代码如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("Book1.csv")

X = np.array((df["X"])) 

Y = np.array((df["Y"])) 

Z = np.array((df["Z"])) 

countour = plt.tricontour(X/340, Y, Z, levels=[100, 200, 500, 1000])
plt.axis([0, 0.6, 0, 40.1])
plt.show()
  • 当前绘制效果:等值线突破黑色边界线,延伸至无数据的空白区域
  • 期望绘制效果:等值线仅在黑色边界线包裹的有效数据区域内显示
解决方法

问题出在plt.tricontour默认会基于数据点的凸包范围进行插值计算,所以会在无数据的区域生成等值线。要让等值线只在有效数据区域内显示,需要先对三角剖分进行掩码处理,过滤掉凸包外的无效三角形:

修改后的代码如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.tri import Triangulation, TriAnalyzer

df = pd.read_csv("Book1.csv")

X = df["X"].values / 340
Y = df["Y"].values
Z = df["Z"].values

# 创建三角剖分对象
tri = Triangulation(X, Y)
# 分析并标记需要屏蔽的无效三角形
analyzer = TriAnalyzer(tri)
# 过滤掉形状异常的三角形(min_circle_ratio可根据数据调整)
mask = analyzer.get_flat_tri_mask(min_circle_ratio=0.01)
tri.set_mask(mask)

# 使用带掩码的三角剖分绘制等值线
plt.tricontour(tri, Z, levels=[100, 200, 500, 1000])
plt.axis([0, 0.6, 0, 40.1])
plt.show()

如果上述方法仍有少量越界等值线,可以进一步提取数据的边界点构建多边形,再用matplotlib.path.Path对生成的等值线进行裁剪,但基于三角剖分掩码的方法已经能解决大部分场景的问题。

内容的提问来源于stack exchange,提问作者justumarsajjad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:45:54