python - 使用 matplotlib 绘制的 3d 对象的顺序
问题描述
我想想象一艘穿过海浪的船。我使用 plot_surface 绘制海面,船是 3d 补丁的集合。无论我如何设置元素的顺序,它们总是以 3d 表面覆盖船的方式出现。我希望船更显眼。尝试了 plot_wireframe 而不是表面,但线条仍然在顶部。有任何想法吗?
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as mp3d
L=180 # wavelength
Nx=256
dx=4.0*L/Nx
kxi=int(Nx*dx/L)
kx=2*np.pi*kxi/dx/Nx
L=2*np.pi/kx
omega=np.sqrt(9.81*2*np.pi/L)
ship_nodes=20*(np.array([[0,0,0],[-5,-2,-1],[-5,-2,1],[5,-2,1],[5,-2,-1],[-5,2,-1],[-5,2,1],[5,2,1],[5,2,-1],[7,0,-1],[7,0,1]],dtype=np.float32))+np.array([Nx*dx/2,Nx*dx/2,0])
x=ship_nodes
ship_planes=[x[1:5],x[5:9],x[[2,6,7,3]],x[[1,4,8,5]],x[[1,2,6,5]],x[[3,10,7]],x[[4,9,8]],x[7:11],x[[3,4,9,10]]]
X,Y=np.meshgrid(np.linspace(0,Nx*dx,Nx),np.linspace(0,Nx*dx,Nx))
A=np.zeros((Nx,Nx),dtype=np.complex64)
A[int(Nx/2)+kxi,int(Nx/2)]=10.0j
Z=np.real(np.fft.ifftn(np.fft.ifftshift(A), axes=(0, 1))*(Nx*Nx))
fig=plt.figure('Ship')
ax=mp3d.Axes3D(fig)
p=mp3d.art3d.Poly3DCollection(ship_planes,zorder=10)
p.set_facecolor((0,0.5,0))
p.set_edgecolor('k')
p.set_zorder(10)
p1=ax.plot_surface(X,Y,Z.T,zorder=1,lw=1)
p1.set_zorder(1)
c1=ax.add_collection3d(p1)
c2=ax.add_collection3d(p)
ax.set_xlim3d(0,Nx*dx)
ax.set_ylim3d(0,Nx*dx)
ax.set_zlim3d(-Nx*dx/2,Nx*dx/2)
fig.show()
解决方案
推荐阅读
- python - 在哪里托管 GCP 上的 pub 子发布者?
- azure - Azure VM 规模集自动缩放动态实例计数
- python - 需要使用硒打印倒计时
- react-native - 连接条带以反应本机应用程序错误
- ruby-on-rails - 未捕获的类型错误:无法读取 null 的属性“addEventListener”。无法启动视频源。Face-Api.js 和 Rails 5
- javascript - Jquery触发点击事件不适用于P元素
- python - 从 pandas groupby 在每个组中执行操作(滚动平均值/添加新列)的有效方法
- javascript - Firefox Addon 如何无法从 Popup JS 访问浏览器页面 DOM?
- ffmpeg - 视频转码和编解码器问题
- php - 间歇性 openssl_decrypt 错误(精确 16 个字节的 IV)