【问题标题】:Updating pyplot graph in real time实时更新pyplot图
【发布时间】:2017-06-21 20:50:09
【问题描述】:

我正在尝试绘制二维数据网格并将它们映射到颜色。然后我想更新这些值并使用新值更新图表。目前图表只显示最终结果,而不是图表应该经历的所有中间阶段。

我的代码::

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()

【问题讨论】:

    标签: python matplotlib time


    【解决方案1】:

    pyplot 通常在调用pyplot.show() 之前不会显示任何内容,除非matplotlib 在“交互”模式下运行。调用pyplot.ion()进入交互模式,调用pyplot.ioff()可以再次退出。

    因此,您应该可以通过在某处调用 pyplot.ion() 来查看所有更新,然后再执行任何您想要直接更新的操作,然后以 pyplot.ioff() 结束您的程序以回到标准的 pyplot 方式完成。

    但是,它可能看起来不太流畅,具体取决于您的系统和您正在进行的更新。

    【讨论】:

      【解决方案2】:

      所以我不确定这是否是一个的答案,我之前只使用过一次更新图。但这是实现您想要的一种方式。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 2016-02-24
        • 2014-02-11
        相关资源
        最近更新 更多