gpt4 book ai didi

python - 如何在不影响主情节比例的情况下绘制平面?

转载 作者:行者123 更新时间:2023-12-04 10:48:15 24 4
gpt4 key购买 nike

我试图在一个情节上绘制一个平面,而不会使主要情节超出比例或被覆盖。理想情况下,我想要的是在波函数的复杂可视化中帮助可视化势垒,这可以通过以某种方式在势区之间创建一个阴影体积来完成......我想我可以为此目的制作两个平面但他们策划了我的主要情节。这是我分别尝试的没有和有平面的结果图的两张图片:

Picture without the planes

Picture of the planes

我想我可能会覆盖主要情节,但我找不到这个问题的明确解决方案,这是我用来制作情节和动画的代码(如果需要,我可以分享整个代码):

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1.5, 0.7, 0.7, 1]))

line,=ax.plot(x,IMAG[0,:],REAL[0,:],"r",linewidth=0.5)

ax.set_xlabel('Posició (nm)')
ax.set_ylabel('$Im[\psi(x,t)]$')
ax.set_zlabel('$Re[\psi(x,t)]$')

#Here are the two planes
yy, zz = np.meshgrid(range(-2,2), range(-2,2))

ax2 = plt.subplot(projection='3d')
ax2.plot_surface(-l, yy, zz,color='b',alpha=0.2)
ax2.plot_surface(l, yy, zz,color='b',alpha=0.2)

def animacio(i):
ax.collections.clear()
line.set_data(REAL[i,:],IMAG[i,:])
line.set_3d_properties(x, 'x')


return line,
ani=animation.FuncAnimation(fig,animacio,interval=50, frames=Nt,repeat=True)
ani.save(f'Evolució_[{V0},{L},{l},{xi},{sigmax},{T}].mp4', writer="ffmpeg", dpi=300)
plt.show()

最佳答案

您正在单独的 subplot 上绘制平面从波函数。代替

ax2 = plt.subplot(projection='3d')
ax2.plot_surface(-l, yy, zz,color='b',alpha=0.2)
ax2.plot_surface(l, yy, zz,color='b',alpha=0.2)

尝试

ax.plot_surface(-l, yy, zz, color='b', alpha=0.2)
ax.plot_surface(l, yy, zz, color='b', alpha=0.2)

您应该在与波函数相同的图上看到平面。您可能还需要删除

ax.collections.clear()

从动画功能,使用 set_dataset_3d_properties应该足以在不改变平面的情况下对波函数进行动画处理。

编辑

为了防止平面的绘图影响绘图的比例,您可以提前设置绘图的限制,即

ax.set_xlim([-20, 20])
ax.set_ylim([-0.6, 0.6])
ax.set_zlim([-0.6, 0.6])

但是,请注意,无论如何都会绘制平面的整个范围 - 有必要正确执行创建以解决此问题。以下应该这样做

yy, zz = np.meshgrid(np.linspace(-1,1), np.linspace(-1,1))

我在使用 set_data 时遇到问题和 set_3d_properties在过去,如果这些不起作用,那么您必须简单地清除轴并重新绘制波函数和边界平面,同时重置每次迭代的限制。

下面是一个完整的例子,它说明了上述内容

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

n = 200
fig = plt.figure(figsize=(16,6))
ax = fig.add_subplot(111, projection='3d')
yy, zz = np.meshgrid(np.linspace(-1,1), np.linspace(-1,1))

def update(i):
# Show propagation of demonstration wavefunction in +x direction
i *= 22
p = np.zeros((3, n*4))
p[0,:] = np.linspace(-np.pi*16, np.pi*16, n*4)
x = p[0,i:i+n*2]
p[1,i:i+n*2] = np.sin(2*x + np.pi/2) * np.sin(x/16 + np.pi/2)/2
p[2,i:i+n*2] = np.sin(2*x) * np.cos(x/16)/2
# Plotting
plt.cla()
ax.set_xlim([-np.pi*16, np.pi*16])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.plot_surface(np.full_like(yy, -np.pi*16), yy, zz, color='b', alpha=0.2)
ax.plot_surface(np.full_like(yy, np.pi*16), yy, zz, color='b', alpha=0.2)
plot, = ax.plot(p[0,:], p[1,:], p[2,:], color='red', lw=1)
return plot,

anim = animation.FuncAnimation(fig, update, frames=n//10, interval=2000/(n//10))
anim.save('wavefunc.gif', writer='imagemagick')

enter image description here

关于python - 如何在不影响主情节比例的情况下绘制平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59602648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com