I'm currently having some trouble with Matplotlib. I have an FDTD program that gets 'washed out' as it runs because the background color of the image seems to average. I would like to set it all to black (the 0 values of the array). How would I go about doing this? I found this on Matplotlib's website , but it doesn't work when I try it (it keeps telling me it didn't expect a byte for colormap).
Also: Is there any way to further vectorize the while loop? I was thinking something along the lines of creating an array of 'mask' values that would indicate whether or not the values get evaluated. Trying to create another index yells at me for casting to multiple values.
Code:
# -*- 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()
Also: I've never had to put that coding line at the top until I switched to Eclipse as my IDE. Why is this now necessary?
Use this:
plt.imshow(E[:,:], cmap = 'spectral', vmin=0)
to prevent it from using the lowest value in your array as the lowest value in the colormap. There's also the vmax parameter if you want to keep the same colormap through each step.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.