Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实时更新pyplot图_Python_Matplotlib_Time - Fatal编程技术网

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