我有以下代码来生成一个简单的图形。
%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)
代码可以很好地生成图- output
但当我拖动滑块时,图形不会更新。你知道为什么会这样吗?
发布于 2021-02-05 17:29:14
注意:你的代码实际上是开箱即用的,所以更新你的依赖项可能是值得的,看看这样做是否能修复它。
但是,您想要更改的主要内容是调用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
还有一个基于widget的notebook后端(也可以在jupyterlab中使用):ipympl,可以与pip install ipympl
一起安装,也可以与%matplotlib ipympl
一起使用
一般来说,ipympl后端将比notebook后端更好地与其他小部件协同工作。
结合使用interactive
和matplotlib
interactive
的一个不幸的结果是,它假设每次滑块值发生变化时,输出都会完全重新生成。这并不总是与您正在使用的set_data
方法配合得非常好。因此,您最好手动生成并连接滑块。我还会注意到,我已经编写了一个包,该包使用set_data
命令自动将小部件连接到更新matplotlib plots: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))
发布于 2021-02-05 14:40:14
这会起作用的。
# load the interactive tool
from ipywidgets import interact, interactive, widgets, fixed
try:
from ipywidgets import Layout
except:
pass
import numpy as np
import matplotlib.pyplot as plt
%matplotlib notebook
def fta(freq = 50.0):
"showing sine frequency"
y = np.sin(freq*x)
f, ax1 = plt.subplots(nrows=1,figsize=(8,6))
ax1.plot(x[0:100], y[0:100],'b')
ax1.set_ylim(ymin=-1.1, ymax=1.1)
ax1.grid();
# then use it interactively,
interactive( fta, freq=(0.0,100.0))
https://stackoverflow.com/questions/66004177
复制相似问题