2014-10-22 91 views
2

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

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

回答

1

其实,你的第一个版本也工作得很好。问题在于,因为im使用零数组进行初始化,色标的vminvmax都是零。更新至im之后,使用set_data未更新vminvmax,而ax.imshow自动重新调整颜色范围。如果年初设定的东西合理的颜色范围,它工作正常:

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

这就是你需要从代码中的问题,改变的唯一的事情,使之(在动画功能与im.set_data)工作。

+0

非常感谢! :) – DarthSpeedious 2014-10-24 16:27:19

1

我得到的程序中,通过一些改变,但我不明白为什么它不工作我写的问题的工作方式。这是我改变了:

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