Python matplotlib imshow未更新

Python matplotlib imshow未更新,python,matplotlib,plot,Python,Matplotlib,Plot,我试图用数值方法求解热方程,并使用彩色贴图实时可视化解决方案。但是,地图中的颜色不会更新。原因是什么?代码如下: from __future__ import division from pylab import * dx, dy = 0.01, 0.01 D = 0.01 dx2, dy2 = dx**2 ,dy**2 dt = (dx2*dy2)/(2*D*(dx2+dy2)) endt = 0.1 Nt = int (endt/dt) endX,endY = 1,1 nx, ny = i

我试图用数值方法求解热方程,并使用彩色贴图实时可视化解决方案。但是,地图中的颜色不会更新。原因是什么?代码如下:

from __future__ import division
from pylab import *

dx, dy = 0.01, 0.01
D = 0.01
dx2, dy2 = dx**2 ,dy**2
dt = (dx2*dy2)/(2*D*(dx2+dy2))
endt = 0.1
Nt = int (endt/dt)
endX,endY = 1,1
nx, ny = int(endX/dx), int(endY/dy)
T = zeros([nx,ny])
Tcopy = zeros([nx,ny])
"""initial conditions"""

for i in range(nx):
 for j in range(ny):
  if( ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 < 0.1) and ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 >0.05) ):
   T[i][j] = 10


def integrate(T,Tcopy):

 T[1:-1, 1:-1] = Tcopy[1:-1, 1:-1] + D*dt*( (Tcopy[2:, 1:-1] - 2*Tcopy[1:-1, 1:-1] + T[:-2, 1:-1])/dx2 + (Tcopy[1:-1, 2:] - 2*Tcopy[1:-1, 1:-1] + T[1:-1, :-2])/dy2  )
 Tcopy = copy(T)
 return Tcopy,T

x = arange(0, endX, dx)
y = arange(0, endY, dy)
X,Y = meshgrid(x, y)

"""creating the plot"""

fig, ax_lst = plt.subplots(1, 1)
im = ax_lst.imshow(T, interpolation='nearest',
                            origin='bottom',
                            aspect='auto',
                            vmin=np.min(T),
                            vmax=np.max(T),
                            cmap='hot',extent=[0,1,0,1])
fig.colorbar(im)

"""main loop"""

for t in range(Nt):
 im.set_data(T)
 plt.draw()
 plt.pause(0.1)
 Tcopy,T = integrate(T,Tcopy)
来自未来进口部的

从派拉布进口*
dx,dy=0.01,0.01
D=0.01
dx2,dy2=dx**2,dy**2
dt=(dx2*dy2)/(2*D*(dx2+dy2))
endt=0.1
Nt=int(endt/dt)
endX,endY=1,1
nx,ny=int(endX/dx),int(endY/dy)
T=零([nx,ny])
Tcopy=零([nx,ny])
“初始条件”
对于范围内的i(nx):
对于范围内的j(ny):
如果((i*dx-0.5)**2+(j*dy-0.5)**2<0.1)和((i*dx-0.5)**2+(j*dy-0.5)**2>0.05)):
T[i][j]=10
def集成(T、Tcopy):
T[1:-1,1:-1]=Tcopy[1:-1,1:-1]+D*dt*((Tcopy[2:-1,1:-1]-2*Tcopy[1:-1,1:-1]+T[:-2,1:-1:-1]+T[1:-1,1:-2])/dy2)
T复制=复制(T)
返回Tcopy,T
x=arange(0,endX,dx)
y=arange(0,endY,dy)
十、 Y=网格网格(X,Y)
“”“正在创建绘图”“”
图,ax_lst=plt.子批次(1,1)
im=ax_lst.imshow(T,插值='nearest',
原点='bottom',
aspect='auto',
vmin=np.min(T),
vmax=np.max(T),
cmap='hot',范围=[0,1,0,1])
图颜色条(im)
“主循环”
对于范围内的t(Nt):
im.set_数据(T)
plt.draw()
plt.暂停(0.1)
Tcopy,T=集成(T,Tcopy)

如果希望颜色栏表示的范围更改动画的每一帧,请按如下方式修改for循环:

for t in range(Nt):
 im.set_data(T)
 im.set_clim(T.min(),T.max())
 plt.draw()
 plt.pause(0.1)
 Tcopy,T = integrate(T,Tcopy)

比较左侧和右侧:

from __future__ import division
from pylab import *

dx, dy = 0.01, 0.01
D = 0.01
dx2, dy2 = dx**2 ,dy**2
dt = (dx2*dy2)/(2*D*(dx2+dy2))
endt = 0.1
Nt = int (endt/dt)
endX,endY = 1,1
nx, ny = int(endX/dx), int(endY/dy)
T = zeros([nx,ny])
Tcopy = zeros([nx,ny])
"""initial conditions"""

for i in range(nx):
 for j in range(ny):
  if( ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 < 0.1) and ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 >0.05) ):
   T[i][j] = 10


def integrate(T,Tcopy):

 T[1:-1, 1:-1] = Tcopy[1:-1, 1:-1] + D*dt*( (Tcopy[2:, 1:-1] - 2*Tcopy[1:-1, 1:-1] + T[:-2, 1:-1])/dx2 + (Tcopy[1:-1, 2:] - 2*Tcopy[1:-1, 1:-1] + T[1:-1, :-2])/dy2  )
 Tcopy = copy(T)
 return Tcopy,T

x = arange(0, endX, dx)
y = arange(0, endY, dy)
X,Y = meshgrid(x, y)

"""creating the plot"""

fig, ax_lst = plt.subplots(1, 2)
ax_lst[0].imshow(T, interpolation='nearest',
                            origin='bottom',
                            aspect='auto',
                            vmin=np.min(T),
                            vmax=np.max(T),
                            cmap='hot',extent=[0,1,0,1])
im = ax_lst[1].imshow(T, interpolation='nearest',
                            origin='bottom',
                            aspect='auto',
                            vmin=np.min(T),
                            vmax=np.max(T),
                            cmap='hot',extent=[0,1,0,1])
fig.colorbar(im)

"""main loop"""

for t in range(Nt):
 im.set_data(T)
 plt.draw()
 plt.pause(0.1)
 Tcopy,T = integrate(T,Tcopy)
 print np.mean(T), np.max(T), np.min(T)

“地图上的颜色”是什么意思?你想更改颜色条的限制吗?代码对我来说似乎很好,我看到戒指随着时间的推移扩散和冷却。在任何时候,我都想通过颜色(较冷的区域,较深的颜色)查看不同区域的温度。现在,不仅颜色栏的限制没有改变(我不希望它改变),而且在模拟过程中颜色也没有改变。如果某个点的T值从100变为10,我希望看到该区域的颜色发生变化,但这不会发生。从头到尾都是一样的红色。但是,如果我创建了两个不同的绘图,没有动画,一个在开头,一个在结尾,可以注意到这两个绘图之间的颜色差异。在
imshow
中设置
vmax=5
。颜色正在变化(至少在我的机器上是这样),但它非常微妙,很难看到。如果您想确定,请在循环中添加一个
savefig
,并在每一帧保存一个快照。谢谢!如何在不更新颜色栏的情况下更新地图中的颜色?我希望在整个模拟过程中保持相同的颜色范围。您必须创建自己的颜色贴图。请检查matplotlib.colors.LinearSegmentedColormap和reference[在StackOverflow上]的pydoc。您可以使用上述AxeImage实例的
set\u cmap
方法来分配colormap。@user1767774您对其进行了充分的排序吗?
im = ax_lst.imshow(T, interpolation='nearest',
                        origin='bottom',
                        aspect='auto',
                        vmin=np.min(T) + .01, # so 0 doesn't blow up the log
                        vmax=np.max(T),
                        cmap='hot',extent=[0,1,0,1],
                        norm=matplotlib.colors.LogNorm(clip=True),)