如何在启用交互模式的情况下更新ipywidget中的matplotlib plot?

2024-10-05 19:12:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个Jupyter笔记本,它从传感器读取数据,我想在读取数据时绘制它。当用户单击按钮时,数据应开始打印。 我在Spyder IDE中测试了基本代码,它工作正常,但当我尝试在Jupyter笔记本上实现它时,它工作不正常

这是我的代码。我一直按着按钮,以显示我正在努力实现的目标

import numpy as np
import ipywidgets as widgets
from ipywidgets import interactive
import matplotlib.pyplot as plt
from IPython.display import display

BotGraf = widgets.ToggleButton(value=False,
    description='Graficar',
    disabled=False,
    button_style='info',
    tooltip='Description',
    icon='chart-line'
)

SalidaEjes = widgets.Output(layout=widgets.Layout(width="75%"))

def FBotGraf(ValBotGraf):
    if ValBotGraf == True:
        global NumEl
        global d
        NumEl = np.arange(0, 100)
        d = np.zeros(100)
        plt.ion()

        with SalidaEjes:
            fig = plt.figure()
            ax = fig.add_subplot(111)
            line1, = ax.plot(NumEl, d, 'r-')
            plt.show()

            i=0

            while i < 100:
                d[i] = np.random.rand()
                line1.set_ydata(d)
                fig.canvas.draw()
                fig.canvas.flush_events()
                plt.show()
                i += 1
        
IBotGraf = interactive(FBotGraf, ValBotGraf = BotGraf)

display(BotGraf)
display(SalidaEjes)

这样,将显示绘图,但绘制原始数据d = np.zeros(100),而不更新绘图

但是,如果我尝试在以下单元格中绘制它:

fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(NumEl, d, 'r-')

它表明d实际上是在循环中更新的。 plot of d outside the cycle and the function

我读了这些问题: Interactive Graph with matplotlib and ipywidgetInteractive matplotlib using ipywidgets。 但要么没有正确地应用它们,要么没有解决问题

我想这不是一个复杂的问题,但我想不出来

谢谢你的阅读


Tags: importmatplotlibasdisplaynpfig绘制plt