matplotlib 3D绘图中的平面

问题描述 投票:0回答:2

我正试图用matplotlib创建一个3D图,它表示一个特定域的外部边界。这个边界由一个上表面和下表面组成,可以很容易地用 plot_surface 的方法。我的问题是要把四个平行于 xz-和 yz-平面的平面可视化(见下面的附图)。由于这些曲面也限制了域,我希望它们的颜色稍微透明。我的问题是,我怎样才能实现这个目标?下文附上了一个最小的上下限工作示例以及一张图片,说明了所需的结果。先谢谢您的帮助。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

# Values for g11up and g11dw
x = np.linspace(-1, 1, 50)

# Meshgrid
X, Y = np.meshgrid(x, x)
Z = 2 - (X**2 + Y**2)

# Create figure and axes
fig = plt.figure(figsize=(4, 4.5))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_zlabel(r'$z$')

# Plot the upper surface
ax.plot_surface(X, Y, -Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot the lower surface
ax.plot_surface(X, Y, Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot edges
z = 1-x**2
for sign in [1, -1]:
    ax.plot(x, np.ones(len(x)), sign*z, color='k', lw=1, zorder=3)
    ax.plot(x, -np.ones(len(x)), sign*z, color='k', lw=1, zorder=4)
    ax.plot(np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=4)
    ax.plot(-np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=3)

ax.set_aspect('equal')
plt.show()
plt.close()

enter image description here

python matplotlib plot 3d
2个回答
1
投票

在这里,你去。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection # New import

# Values for g11up and g11dw
x = np.linspace(-1, 1, 50)

# Meshgrid
X, Y = np.meshgrid(x, x)
Z = 2 - (X**2 + Y**2)

# Create figure and axes
fig = plt.figure(figsize=(4, 4.5))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_zlabel(r'$z$')

# Plot the upper surface
ax.plot_surface(X, Y, -Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot the lower surface
ax.plot_surface(X, Y, Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot edges
z = 1-x**2
for sign in [1, -1]:
    ax.plot(x, np.ones(len(x)), sign*z, color='k', lw=1, zorder=3)
    ax.plot(x, -np.ones(len(x)), sign*z, color='k', lw=1, zorder=4)
    ax.plot(np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=4)
    ax.plot(-np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=3)

# Plot faces
for sign in [1,-1]:
    xyz_upper = np.stack((x,sign*np.ones(x.shape), z)).T
    xyz_lower = np.stack((x,sign*np.ones(x.shape),-z)).T[::-1]
    xyz = np.concatenate((xyz_upper,xyz_lower))
    verts = [ ( xyz[i,0], xyz[i,1], xyz[i,2] ) for i in range(xyz.shape[0])  ]
    ax.add_collection3d(Poly3DCollection([verts], alpha=0.5, facecolor='orange'))

ax.set_aspect('equal')
plt.show()

一定有办法把numpy数组直接传给... ... Poly3DCollection 而没有把它转换为一个tuple的列表,但我没有找它。

这就是结果。

enter image description here

很明显我用的是橙色 我只画了两个与y轴平行的面 但把它延伸到其他面就可以了。

我的答案是受这个启发的 回答.当改变颜色时,你可能会遇到以下情况。这个毛病.

© www.soinside.com 2019 - 2024. All rights reserved.