我正试图用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()
在这里,你去。
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的列表,但我没有找它。
这就是结果。
很明显我用的是橙色 我只画了两个与y轴平行的面 但把它延伸到其他面就可以了。