在2D中绘制3D多边形

时间:2017-07-04 09:59:20

标签: python matplotlib 3d 2d delaunay

我现在长期寻找正确的实施方案。

我有一个3D delaunay三角测量,并希望在2D中绘制这个。 在3D中我设法这样做: Complex 3D delauny triangulation. Half of the triangles hidden.

我需要一个2D情节。我使用matplotlib.tripcolor方法或matplotlib.collections.PolyCollection得到的是:

Complex 3D delauny triangulation mapped to 2D. Some triangles from the back of the structure are plotted

如何在没有顶部和背部三角形混合的情况下在2D中绘制此图?到目前为止尝试了所有方法,一些三角形被三角形隐藏,应该在结构的后面。

我看到,这些方法没有必要的信息以正确的顺序绘制,因为我必须提供2D数组。深度信息丢失。

有人知道怎么做吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以使用Axes3d模拟2D绘图,方法是设置正交投影,初始化视图以面向所需的平面,并沿垂直于所选平面的轴移除不需要的绘图元素。此外,您可以使用zdir关键字参数绘制2D元素。

这是我修改以演示

的matplotlib 3D绘图示例之一
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

# Enable orthographic projection
# https://stackoverflow.com/questions/23840756/how-to-disable-perspective-in-mplot3d
from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    a = (zfront+zback)/(zfront-zback)
    b = -2*(zfront*zback)/(zfront-zback)
    return np.array([[1,0,0,0],
                        [0,1,0,0],
                        [0,0,a,b],
                        [0,0,-0.000001,zback]])
proj3d.persp_transformation = orthogonal_proj

fig = plt.figure()
ax = fig.gca(projection='3d')

# Init view to YZ plane
ax.view_init(azim=0, elev=0)

# Hide the X axis
ax.w_xaxis.line.set_lw(0.)
ax.set_xticks([])

# Change YZ plane colour to white
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))

# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)
ax.set_zlim(-1.1, 1.1)
ax.set_ylabel('y')
ax.set_zlabel('z')

# Plot 2D elements with zdir argument
# https://stackoverflow.com/questions/29549905/pylab-3d-scatter-plots-with-2d-projections-of-plotted-data
stepsize = 0.1
t = np.arange(-4, 4+stepsize, step=stepsize)
ax.plot(t, 0.5*np.sin(t), 'k', zdir='x', linewidth=1.0)
ax.text(0, 0, 1, 'Text', zdir='y', ha='center', va='top')

plt.show()

enter image description here