Python 实时更新pyplot图
我试图绘制一个二维数据网格,并将其映射到颜色。然后我想更新这些值,并用新值更新图表。目前,图表仅显示最终结果,而不是图表应经历的所有中间阶段 我的代码::Python 实时更新pyplot图,python,matplotlib,time,Python,Matplotlib,Time,我试图绘制一个二维数据网格,并将其映射到颜色。然后我想更新这些值,并用新值更新图表。目前,图表仅显示最终结果,而不是图表应经历的所有中间阶段 我的代码:: import matplotlib.pyplot as pyplot import matplotlib as mpl import numpy as np import time import matplotlib.animation as animation thing=0 NUM_COL=10 NUM_ROW=10 zvals=
import matplotlib.pyplot as pyplot
import matplotlib as mpl
import numpy as np
import time
import matplotlib.animation as animation
thing=0
NUM_COL=10
NUM_ROW=10
zvals=np.full((NUM_ROW,NUM_COL),-5.0)
def update_graph(zvals):
zvals+=1
pyplot.clf()
img = pyplot.imshow(zvals,interpolation='nearest',
cmap = cmap,norm=norm)
time.sleep(1)
pyplot.draw()
# make a color map of fixed colors
cmap = mpl.colors.ListedColormap(['blue','black','red'])
bounds=[-6,-2,2,6]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# tell imshow about color map so that only set colors are used
img = pyplot.imshow(zvals,interpolation='nearest',
cmap = cmap,norm=norm)
# make a color bar
pyplot.colorbar(img,cmap=cmap,norm=norm,boundaries=bounds,ticks=[-5,0,5])
pyplot.draw()
for i in range(5):
update_graph(zvals)
pyplot.show()
pyplot
通常在调用pyplot.show()
之前不会显示任何内容,除非matplotlib
在“交互”模式下运行。交互模式通过调用pyplot.ion()
进入,并可以通过调用pyplot.ioff()
再次退出
因此,您应该可以在执行任何希望直接更新的操作之前,通过调用pyplot.ion()
在某个地方查看所有更新,然后使用pyplot.ioff()
结束程序,以便在完成后回到标准的pyplot
方式
但是,根据您的系统和正在进行的更新,它可能看起来不是很平滑。所以我不确定这是否是一个好答案,我以前只使用过一次更新图。但这是一种实现你想要的方式
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
NUM_COL = 10
NUM_ROW = 10
zvals = np.full((NUM_ROW,NUM_COL),-5.0)
cmap = mpl.colors.ListedColormap(['blue','black','red'])
bounds = [-6,-2,2,6]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
fig = plt.figure() # Create the figure
img = plt.imshow(zvals,interpolation='nearest', cmap=cmap,norm=norm) # display the first image
plt.colorbar(img,cmap=cmap,norm=norm,boundaries=bounds,ticks=[-5,0,5]) # create your colour bar
# If we dont have this, then animation.FuncAnimation will call update_graph upon initialization
def init():
pass
# animation.FuncAnimation will use this function to update the plot. This is where we update what we want displayed
def update_graph(frame):
global zvals # zvals is a global variable
zvals+=1
img.set_data(zvals) # This sets the data to the new, updated values
print("Frame Update {}".format(frame)) # this is for debugging to help you see whats going on
return img
# This is what will run the animations
anim = animation.FuncAnimation(fig, update_graph, init_func = init,
interval = 1000, # update every 1000ms
frames = 8, # Update 8 times
repeat=False) # After 8 times, don't repeat the animation
plt.show() # show our plot