【问题标题】:Matplotlib, avoiding unwanted triangles in plot_trisurf()Matplotlib,在 plot_trisurf() 中避免不需要的三角形
【发布时间】:2013-04-24 10:15:34
【问题描述】:

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

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

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

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

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

    两种选择:

    正确的方法#1

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

    正确的方法#2

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

    快捷方式

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

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

    【讨论】:

    • 我尝试使用vamx 参数但没有成功,您能否使用“正确的方式”解决方案进一步详细说明?
    • @SaulloCastro 我添加了一些链接并扩展了一些。不知道在哪里详细说明。您了解 set_mask 的工作原理吗?这是一个玩具例子吗?您需要通用解决方案还是针对特定问题的解决方案?
    • 这个例子是一个实际问题的极端案例,我们有不同几何形状的圆锥体(还有圆柱体)。解决这个极端情况会解决其他的,更像圆柱体......谢谢你的更新......我会看看......
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2017-12-27
    • 2017-05-05
    • 2019-02-26
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多