Python Matplotlib如何仅显示三角形区域内等高线,tricontourf怎么用
实现方案
方案1:对现有contourf对象直接设置裁剪路径(推荐,改动最小)
不需要修改你已有的网格数据和contourf绘制逻辑,直接通过matplotlib自带的路径裁剪功能实现三角形外的区域剔除,裁剪边缘平滑无锯齿,不需要提高网格分辨率。
示例代码如下:
import matplotlib.pyplot as plt from matplotlib.patches import Polygon import numpy as np # --------------- 以下为你原有代码逻辑,可保留 --------------- # 示例:生成方形网格和Z数据,替换为你自己的实际数据 x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z = np.sin(np.sqrt(X**2 + Y**2)) # 定义三角形三个顶点坐标,替换为你实际的三角形顶点 tri_vertices = np.array([[0, 4], [-4, -2], [4, -2]]) # -------------------------------------------------------- fig, ax = plt.subplots() # 绘制等高线 contour_obj = ax.contourf(X, Y, Z, levels=20) # 创建三角形patch tri_patch = Polygon(tri_vertices, closed=True, fill=False, edgecolor="black") # 给所有等高线集合设置裁剪路径 for collection in contour_obj.collections: collection.set_clip_path(tri_patch) # 按需添加三角形边框 ax.add_patch(tri_patch) ax.set_aspect("equal") plt.show()
方案2:使用tricontourf实现
tricontourf确实是合适的实现方案,如果你原始数据为散点、无需生成方形网格,通过对三角剖分添加掩码即可裁剪非目标区域,省去方形网格插值的步骤。
示例代码如下:
import matplotlib.pyplot as plt from matplotlib.patches import Polygon from matplotlib.path import Path import matplotlib.tri as tri import numpy as np # 示例散点数据,替换为你自己的x,y,z数据 x = np.random.uniform(-5, 5, 5000) y = np.random.uniform(-5, 5, 5000) Z = np.sin(np.sqrt(x**2 + y**2)) tri_vertices = np.array([[0, 4], [-4, -2], [4, -2]]) # 生成非结构化三角剖分 triang = tri.Triangulation(x, y) # 生成掩码:剔除三角形外的三角单元 tri_path = Path(tri_vertices) tri_center = triang.triangles.mean(axis=1) mask = ~tri_path.contains_points(tri_center) triang.set_mask(mask) # 绘制裁剪后的等高线 fig, ax = plt.subplots() ax.tricontourf(triang, Z, levels=20) # 按需添加三角形边框 ax.add_patch(Polygon(tri_vertices, closed=True, fill=False, edgecolor="black")) ax.set_aspect("equal") plt.show()
方案选择建议
- 如果你已经完成了方形网格生成、Z值计算,优先选择方案1,仅需新增3行代码即可实现需求,无需修改原有逻辑。
- 如果你还未生成方形网格、原始数据为散点格式,选择方案2效率更高。
内容的提问来源于stack exchange,提问作者lefe
相关产品推荐
相关产品推荐

