Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib,在plot_trisurf()中避免不需要的三角形_Python_Numpy_Matplotlib - Fatal编程技术网

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

Python Matplotlib,在plot_trisurf()中避免不需要的三角形,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有下面的代码来创建一个圆锥体,稍后将为其应用位移场。在下图中,您可以看到一些大三角形绘制在顶部,而不是底部。我相信有一些内部隐藏参数告诉plot\u trisurf()三角形应该创建到什么距离,否则它们也应该在底部创建 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from numpy import linspace, interp, meshg

我有下面的代码来创建一个圆锥体,稍后将为其应用位移场。在下图中,您可以看到一些大三角形绘制在顶部,而不是底部。我相信有一些内部隐藏参数告诉
plot\u 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()

到目前为止,您可能已经继续前进或自己解决了这个问题,但我想我会为未来的访问者提供一个答案

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

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

两种选择:

正确的道路#1 将的源复制到脚本中,并使用您选择的算法(一些最大边长度标准或查找质心在某个半径内的三角形..任何适合您实际数据的)添加线条(tri是一个
matplotlib.tri.triangulation.triangulation
实例),以在完成三角剖分后创建布尔遮罩

正确的道路#2 使用
三角剖分(x,y,三角形=…)

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


*我没有尝试这两个选项中的任何一个

我尝试使用
vamx
参数,但没有成功,你能用“正确的方式”解决方案进一步深入了解细节吗?@SaulloCastro我添加了一些链接并进行了一些扩展。不知道该在哪里详细说明。你知道set_面具是怎么工作的吗?这是玩具的例子吗?你需要一个通用的解决方案还是具体问题的解决方案?这个例子是一个实际问题的极端情况,我们有不同几何形状的圆锥体(还有圆柱体)。解决这个极端情况将解决其他更像圆柱体的情况。。。谢谢你的更新。。。我会看一看。。。