Matplotlib,避免plot_trisurf()中不需要的三角形

Sau*_*tro 8 python numpy matplotlib

我有以下代码来创建一个稍后将应用置换字段的圆锥体.在下图所示的图中,您可以看到一些大三角形在顶部绘制,但不在底部绘制.我相信有一些内部隐藏参数可以告诉plot_trisurf()我们应该创建三角形的距离,否则它们也应该在底部创建.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from numpy import linspace, interp, meshgrid, sin, cos, pi
numel_circum = 120
L = 38.
rb, rt = (38., 16.)
t1, t2 = (0, 2*pi)
rav = ( rb - rt )*rt/rb + rt
perav = (t2-t1) * rav
elsize_L = perav / numel_circum
numel_L = int(round(L/elsize_L,0))
ts = linspace(t1, t2, numel_circum)
r = lambda z: interp( z, [0, L], [rb, rt] )
zs = linspace(0, L, numel_L)
ts, zs = meshgrid( ts, zs )
ys = r(zs)*sin(ts)
xs = r(zs)*cos(ts)
# plotting
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(xs.flatten(), ys.flatten(), zs.flatten(),
                cmap=cm.jet, linewidth=0.2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Pau*_*aul 4

您现在可能已经自己继续或解决了这个问题,但我想我应该为未来的访客提供一个答案。

在较小的圆中得到三角形的原因不是最大距离问题,而是因为这些三角形包含在 x,y 平面上的点投影的凸包内。

如果您查看plot_trisurf源代码,( numpy.source(Axes3D.plot_trisurf)) 您会发现它每次都会执行 delaunay 三角剖分,并且没有机会定义三角形或排除不需要的三角形。

两种选择:

正确的方法#1

将 的源复制plot_trisurf到您的脚本并使用您选择的算法添加行tri.set_mask(...)(tri 是一个matplotlib.tri.triangulation.Triangulation实例)(一些最大边长标准或查找质心在某个半径内的三角形..无论适合您的实际数据)以创建布尔值三角测量完成后的掩模。

正确的方法#2

定义三角形而不使用 delaunay 三角剖分使用Triangulation(x,y,triangles=...)

快捷的方法

将plot_trisurf 设置vmax为略低于圆平面。

*我没有尝试过这两个选项