如何解决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
相关产品推荐
相关产品推荐

