2011-04-15 125 views
0

我目前Matplotlib有一些麻烦。由于图像的背景颜色似乎平均,我有一个FDTD程序在运行时被“洗掉”。我想将它全部设置为黑色(数组的0值)。我会如何去做这件事?我发现this on Matplotlib's website,但它在我尝试它时不起作用(它一直告诉我它并不期望colormap有一个字节)。Matplotlib设置背景颜色和向量化FDTD方程

此外:有什么办法可以进一步矢量化while循环吗?我正在考虑创建一个'mask'值的数组,这些值将指示值是否被评估。试图创建另一个索引大声对我投掷多个值。

代码:

# -*- coding: cp1252 -*- 
from numpy import * 
from math import * 
import matplotlib.pyplot as plt 

def fdtd(): 
    print 'Starting simulation.' 
    # Define constants and parameters 
    #mu0 = pi*4E-7 # pH/µm 
    #e0 = 8.854187E-12 # Picofarads/micron 
    e0 = 8.85418782E-6 
    mu0 = 1.256637061 
    c = 1/sqrt(mu0*e0) 

    # Simulation Parameters 
    cellsizeX = 100. #Size of Yee-cell x edge in microns 
    cellsizeY = 100. #Size of Yee-cell y edge in microns 
    numX = 200 #Number of cells in X direction 
    numY = 200 #Number of cells in Y direction 
    lengthX = cellsizeX * numX 
    lengthY = cellsizeY * numY 
    dx = cellsizeX 
    dy = cellsizeY 
    dt = 1/(c*sqrt(1/dx**2+1/dy**2)) 
    wavelength = 550E-9 #nm (green) 
    freq = c/wavelength 
    CEy = dt/(dx*mu0) 
    CEx = dt/(dy*mu0) 
    CHx = dt/(dy*e0) 
    CHy = dt/(dx*e0) 
    times = 1 
    y = 0 

    # Array creation 
    print 'Creating arrays' 
    E = zeros(shape=((2*numX+1),(2*numY+1))) 
    Ep = E.copy() 
    H = zeros(shape=(2*numX,2*numY)) 
    Hp = H.copy() 
    Elec = E.copy() 

    #Create indexes 
    index = arange(0,2*numX, 1) 
    xindex = arange(0, 2*numX-1, 2) 
    yindex = arange(0, 2*numY-1, 2) 
    print 'Entering simulation loop.' 
    while times <= 500: 
     y = 0 
     # Initial Conditions 
     if (times < 100): 
      E[numX-50:numX+50,numY-50:numY+50] = times 

     # Calculate H and E fields 
     while y < len(yindex): 
      Hp[xindex+1,yindex[y]+1] = H[xindex+1,yindex[y]+1] - CEy*(E[xindex+2,yindex[y]+1] - E[xindex,yindex[y]+1]) + CEx*(E[xindex+1,yindex[y]+2] - E[xindex+1,yindex[y]]) 
      Ep[xindex,yindex[y]+1] = E[xindex,yindex[y]+1] - CHy*(Hp[xindex+1,yindex[y]+1] - Hp[xindex-1, yindex[y]+1]) 
      Ep[xindex+1,yindex[y]] = E[xindex+1,yindex[y]] + CHx*(Hp[xindex+1, yindex[y]+1] - Hp[xindex+1,yindex[y]-1]) 
      y+=1 

     # Boundary Conditions 
     Ep[numX*2, :] = Ep[numX*2-1,:] 
     Ep[:,numY*2] = Ep[:,numY*2-1] 
     Ep[0,:] = Ep[1,:] 
     Ep[:,0] = Ep[:,1] 

     #Name switching 
     E, Ep, H, Hp = Ep, E, Hp, H 

     #Plotting and Saving 
     plt.imshow(E[:,:], cmap = 'spectral') 
     filename = str('PATH\%03d' % times) + '.png' 
     plt.savefig(filename) 
     plt.clf() 
     times += 1 

if __name__ == '__main__': 
    fdtd() 

另外:我从来没有把该编码线在顶部,直到我切换到Eclipse作为我的IDE。为什么现在这是必要的?

+0

编码行是必要的,因为您在“#mu0 =”注释行中有一个unicode字符。 – 2011-04-15 06:37:19

+0

我会打开一个关于矢量化的单独问题。你有没有尝试过使用yindex(除去[y]和while循环)? – 2011-04-15 06:47:39

+0

对不起,我的建议删除[Y]将无法正常工作。但是你应该看看numpy.meshgrid和http://docs.scipy.org/doc/numpy/reference/generated/numpy.mgrid.html – 2011-04-15 06:54:37

回答

2

使用此:

plt.imshow(E[:,:], cmap = 'spectral', vmin=0) 

,以防止它从你的阵列作为颜色表中的最低值,使用中的最低值。如果要通过每个步骤保留相同的颜色映射,还有vmax参数。

+0

谢谢你,这很好用。 – MercuryRising 2011-04-16 05:14:12