首页 > 解决方案 > Matplotlib 图未使用 ipywidgets 滑块更新

问题描述

我有以下代码来生成一个简单的图表。

%matplotlib notebook
from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, np.sin(x))

def update(w = 1.0):
    line.set_ydata(np.sin(w * x))
    plt.show()

interact(update)

代码生成图就好了 - 输出

但是当我拖动滑块时,图形不会更新。关于为什么会这样的任何想法?

标签: pythonmatplotlibjupyter-notebookdata-visualizationipywidgets

解决方案


注意:您的代码实际上对我来说是开箱即用的,因此可能值得更新您的依赖项并查看是否可以修复它。

但是,您要更改的主要内容是调用fig.canvas.draw()而不是plt.show()

%matplotlib notebook
from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, np.sin(x))

def update(w = 1.0):
    line.set_ydata(np.sin(w * x))
    fig.canvas.draw()

interact(update)

使用 Ipympl

还有一个基于小部件的笔记本后端(也可以在 jupyterlab 中使用):ipympl,您可以安装pip install ipympl和使用它%matplotlib ipympl

一般来说,与笔记本后端相比,ipympl 后端可以更好地与其他小部件一起使用。

interactive与 matplotlib 一起使用

一个不幸的结果interactive是它假定每次滑块值更改时都会完全重新生成输出。set_data对于您使用的方法,这并不总是能很好地发挥作用。因此,您最好手动生成和连接滑块。我还要注意,我编写了一个包,它使用set_data命令将小部件连接到更新 matplotlib 图自动化:https ://mpl-interactions.readthedocs.io/en/stable/ 。使用该软件包,您的代码将是

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import mpl_interactions.ipyplot as iplt

x = np.linspace(0, 2 * np.pi, 1000)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

def f(x, w):
    return np.sin(w * x)

controls = iplt.plot(x, f, w=(1, 10))

推荐阅读