【问题标题】:How to plot a plane without afecting the scale of the main plot?如何在不影响主图比例的情况下绘制平面?
【发布时间】:2020-04-23 10:31:53
【问题描述】:

我正在尝试在没有超出比例或覆盖主图的情况下在图上绘制平面。理想情况下,我想要的是在波函数的复杂可视化中帮助潜在障碍的可视化,这可以通过在势能区域之间以某种方式创建阴影体积来完成......我想我可以为此制作两个平面但他们被策划让我看不见我的主要情节。这是我在没有和分别尝试过的飞机的情况下得到的图的两张图片:

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

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()

【问题讨论】:

    标签: python matplotlib animation plot data-visualization


    【解决方案1】:

    您正在将平面绘制在与波函数不同的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_dataset_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')
    

    【讨论】:

    • 这有助于将平面放在同一个图上,但仍然取决于我为网格选择的范围,平面会改变波函数图的比例。有没有办法在不自动调整比例的情况下绘制东西?
    • 这解决了我的问题,谢谢!然而,我的预期用途是作为一个有限的势垒/井,宽度为 2l,在图中居中以显示隧道效应,现在我认为可能两个平面不够合适,因为透明胶片重叠并且看起来很奇怪......他们使不过为了好的无限边界!这可能是另一个问题的主题,但是有没有一种简单的方法可以绘制一个不重叠其面的长方体?
    • @IsidreMasMagre 您可以尝试使用ax.view_init() 更改绘图的查看几何形状,例如this answerthis demo
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多