【问题标题】:imshow.set_data() not working for FuncAnimationimshow.set_data() 不适用于 FuncAnimation
【发布时间】:2014-12-17 14:51:17
【问题描述】:

我正在编写一个用于 2D FDTD 光传播的程序,在这段代码中,当我在 animate 函数中使用 ax.imshow() 命令运行程序时,程序运行良好,而当我使用 im.set_data() 命令时,它给了我空白图像。有人可以告诉我我在做什么错吗?另外,有人可以告诉我如何在开始时设置颜色图,这样我就不必在动画循环期间更新它。关键是我不希望imshow() 命令在每次循环运行时绘制所有内容。 感谢所有的帮助。我正在学习编程,请建议我做什么。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


xdim = 100        
ydim = 100
epsilon = np.ones([xdim,ydim])*8.854187817*10**(-12)
mu = np.ones([xdim,ydim])*4*np.pi*10**(-7)
c = 299792458
delta = 10**-6
deltat =  delta/(c*(2**0.5))

Hz = np.zeros([xdim,ydim])
Ey = np.zeros([xdim,ydim])
Ex = np.zeros([xdim,ydim])


fig = plt.figure()
ax = plt.axes()
im = ax.imshow(Hz)

Hz[xdim/2,ydim/2]=1

def init():
    im.set_data(np.zeros(Hz.shape))
    return

def animate(n, *args, **kwargs):
    Ex[0:xdim-1,0:ydim-1]=Ex[0:xdim-1,0:ydim-1]+(deltat/(delta*mu[0:xdim-1,0:ydim-1]))*(Hz[1:xdim,0:ydim-1]-Hz[0:xdim-1,0:ydim-1])
    Ey[0:xdim-1,0:ydim-1]=Ey[0:xdim-1,0:ydim-1]-(deltat/(delta*mu[0:xdim-1,0:ydim-1]))*(Hz[0:xdim-1,1:ydim]-Hz[0:xdim-1,0:ydim-1])

    Hz[1:xdim,1:ydim]=Hz[1:xdim,1:ydim]+(deltat/(delta*epsilon[1:xdim,1:ydim]))*(Ex[1:xdim,1:ydim]-Ex[0:xdim-1,1:ydim]-Ey[1:xdim,1:ydim]+Ey[1:xdim,0:ydim-1])
    if(n==0):Hz[xdim/2,ydim/2]=0
    #im.set_data(Hz)                 
    ax.imshow(Hz)     # Delete this command and try running the program with the above command. 
    return

ani = animation.FuncAnimation(fig, animate, init_func=init, frames = 200, interval = 10, blit = False, repeat = False)
fig.show()

【问题讨论】:

    标签: python python-2.7 animation matplotlib scipy


    【解决方案1】:

    实际上,您的第一个版本也运行良好。问题是因为im 是用零数组初始化的,所以色标的vminvmax 都是零。之后使用set_data 更新到im 不会更新vminvmax,而ax.imshow 会自动重新调整颜色范围。如果您在开始时将颜色范围设置为合理的值,则效果很好:

    ax.imshow(Hz, vmin=-0.2, vmax=0.2)
    

    这是您唯一需要更改问题中的代码以使其工作的事情(在动画函数中使用im.set_data)。

    【讨论】:

      【解决方案2】:

      我通过进行一些更改使程序正常工作,但我不明白为什么它不像我在问题中写的那样工作。这是我改变的内容:

      import numpy as np
      import matplotlib.pyplot as plt
      import matplotlib.animation as animation
      
      
      xdim = 100
      ydim = 100
      epsilon = np.ones([xdim,ydim])*8.854187817*10**(-12)
      mu = np.ones([xdim,ydim])*4*np.pi*10**(-7)
      c = 299792458
      delta = 10**-6
      deltat =  delta/(c*(2**0.5))
      
      Hz = np.zeros([xdim,ydim])
      Ey = np.zeros([xdim,ydim])
      Ex = np.zeros([xdim,ydim])
      
      
      
      Hz[xdim/2,ydim/2]=1
      
      def init():
          global fig, ax, im
          fig = plt.figure()
          ax = plt.axes()
          im = ax.imshow(Hz, cmap="jet")
          im.set_data(np.zeros(Hz.shape))
          return
      
      def animate(n):
          Ex[0:xdim-1,0:ydim-1]=Ex[0:xdim-1,0:ydim-1]+(deltat/(delta*mu[0:xdim-1,0:ydim-1]))*(Hz[1:xdim,0:ydim-1]-Hz[0:xdim-1,0:ydim-1])
          Ey[0:xdim-1,0:ydim-1]=Ey[0:xdim-1,0:ydim-1]-(deltat/(delta*mu[0:xdim-1,0:ydim-1]))*(Hz[0:xdim-1,1:ydim]-Hz[0:xdim-1,0:ydim-1])
      
          Hz[1:xdim,1:ydim]=Hz[1:xdim,1:ydim]+(deltat/(delta*epsilon[1:xdim,1:ydim]))*(Ex[1:xdim,1:ydim]-Ex[0:xdim-1,1:ydim]-Ey[1:xdim,1:ydim]+Ey[1:xdim,0:ydim-1])
          if(n==0):Hz[xdim/2,ydim/2]=0
          im.set_data(Hz)                 
          return
      
      init()
      ani = animation.FuncAnimation(fig, animate, frames = 500, interval = 10, blit = False, repeat = False)
      fig.show()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多