How to dynamically update a plot in a loop in Ipython notebook (within one cell)

后端 未结 6 1473
梦如初夏
梦如初夏 2020-11-28 02:19

Environment: Python 2.7, matplotlib 1.3, IPython notebook 1.1, linux, chrome. The code is in one single input cell, using --pylab=inline

I want to use I

相关标签:
6条回答
  • 2020-11-28 02:24

    Try to add show() or gcf().show() after the plot() function. These will force the current figure to update (gcf() returns a reference for the current figure).

    0 讨论(0)
  • 2020-11-28 02:28

    A couple of improvement's on HYRY's answer:

    • call display before clear_output so that you end up with one plot, rather than two, when the cell is interrupted.
    • catch the KeyboardInterrupt, so that the cell output isn't littered with the traceback.
    import matplotlib.pylab as plt
    import pandas as pd
    import numpy as np
    import time
    from IPython import display
    %matplotlib inline
    
    i = pd.date_range('2013-1-1',periods=100,freq='s')
    
    while True:
        try:
            plt.plot(pd.Series(data=np.random.randn(100), index=i))
            display.display(plt.gcf())
            display.clear_output(wait=True)
            time.sleep(1)
        except KeyboardInterrupt:
            break
    
    0 讨论(0)
  • 2020-11-28 02:28

    Adding label to the other solutions posted here will keep adding new labels in every loop. To deal with that, clear the plot using clf

    for t in range(100)
       if t % refresh_rate == 0:
    
         plt.clf()
         plt.plot(history['val_loss'], 'r-', lw=2, label='val')
         plt.plot(history['training_loss'], 'b-', lw=1, label='training')
         plt.legend()
         display.clear_output(wait=True)
         display.display(plt.gcf())
    
    
    0 讨论(0)
  • 2020-11-28 02:41

    You can further improve this by adding wait=True to clear_output:

    display.clear_output(wait=True)
    display.display(pl.gcf())
    
    0 讨论(0)
  • 2020-11-28 02:42

    use IPython.display module:

    %matplotlib inline
    import time
    import pylab as pl
    from IPython import display
    for i in range(10):
        pl.plot(pl.randn(100))
        display.clear_output(wait=True)
        display.display(pl.gcf())
        time.sleep(1.0)
    
    0 讨论(0)
  • 2020-11-28 02:47

    You can do it like this. It accepts x,y as list and output a scatter plot plus a linear trend on the same plot.

    from IPython.display import clear_output
    from matplotlib import pyplot as plt
    %matplotlib inline
        
    def live_plot(x, y, figsize=(7,5), title=''):
        clear_output(wait=True)
        plt.figure(figsize=figsize)
        plt.xlim(0, training_steps)
        plt.ylim(0, 100)
        x= [float(i) for i in x]
        y= [float(i) for i in y]
        
        if len(x) > 1:
            plt.scatter(x,y, label='axis y', color='k') 
            m, b = np.polyfit(x, y, 1)
            plt.plot(x, [x * m for x in x] + b)
    
        plt.title(title)
        plt.grid(True)
        plt.xlabel('axis x')
        plt.ylabel('axis y')
        plt.show();
    

    you just need to call live_plot(x, y) inside a loop. Here's how it looks:

    0 讨论(0)
提交回复
热议问题