【问题标题】:Dynamically update plot in iPython notebook在 iPython 笔记本中动态更新绘图
【发布时间】:2015-11-10 03:36:29
【问题描述】:

this question 中所述,我正在尝试在 iPython 笔记本中(在一个单元格中)动态更新绘图。 不同之处在于我不想绘制新线,但我的 x_data 和 y_data 在某个循环的每次迭代中都在增长。

我想做的是:

import numpy as np
import time
plt.axis([0, 10, 0, 100]) # supoose I know what the limits are going to be
plt.ion()
plt.show()
x = []
y = []
for i in range(10):
     x = np.append(x, i)
     y = np.append(y, i**2)
     # update the plot so that it shows y as a function of x
     time.sleep(0.5) 

但我希望情节有一个传奇,如果我这样做了

from IPython import display
import time
import numpy as np
plt.axis([0, 10, 0, 100]) # supoose I know what the limits are going to be
plt.ion()
plt.show()
x = []
y = []
for i in range(10):
    x = np.append(x, i)
    y = np.append(y, i**2)
    plt.plot(x, y, label="test")
    display.clear_output(wait=True)
    display.display(plt.gcf())
    time.sleep(0.3)
plt.legend()

我最终得到一个包含 10 个项目的图例。如果我将plt.legend() 放入循环中,则图例会在每次迭代中增长……有什么解决方案吗?

【问题讨论】:

    标签: python matplotlib ipython-notebook


    【解决方案1】:

    目前,每次plt.plot 在循环中时,您都会创建一个新的 Axes 对象。

    因此,如果您在使用plt.plot 之前清除当前轴(plt.gca().cla()),并将图例放入循环中,则它不会每次都增加图例:

    import numpy as np
    import time
    from IPython import display
    
    x = []
    y = []
    for i in range(10):
        x = np.append(x, i)
        y = np.append(y, i**2)
        plt.gca().cla() 
        plt.plot(x,y,label='test')
        plt.legend()
        display.clear_output(wait=True)
        display.display(plt.gcf()) 
        time.sleep(0.5) 
    

    编辑: 正如@tcaswell 在 cmets 中指出的那样,使用 %matplotlib notebook 魔术命令可以为您提供可以更新和重绘的实时图形。

    【讨论】:

    • 更好,但如果我这样做,图例在循环结束之前不可见
    • 还有一件事:当我运行我的 sn-p(添加你的行并更改 legend() 位置)时,我最终得到了两个图像。知道为什么吗?
    • 尝试切换display.clear_outputdisplay.display 行的顺序。您在 Q 中链接到的问题的答案中对此进行了更详细的讨论
    • 如果您使用%matplotlib notebook 可以做得更好,它会为您提供可以更新和重新绘制的实时图形(以及平移/缩放和鼠标+键盘事件)
    • 回复:@P。 Camilleri 的评论:我在循环结束时添加了%matplotlib inline(或者在单元格的末尾,无论哪种方式都有效。)作为一种技巧,以删除第二个情节的出现(当单元格结束时)。切换display.clear_outputdisplay.display 的顺序对我不起作用。我还没有找到将%matplotlib notebook 用于我的动态绘图的正确方法,因此这同时可以作为临时解决方案。我在笔记本的其他任何地方都使用%matplotlib inline,所以无论如何重置它对我来说可能是有意义的:-)
    猜你喜欢
    • 2014-02-17
    • 2015-10-15
    • 2016-03-23
    • 1970-01-01
    • 2023-03-21
    • 2016-04-11
    • 2015-08-21
    • 2015-06-17
    • 2013-10-24
    相关资源
    最近更新 更多