在活页夹上使用ipyvidgets和matplotlib进行交互式绘图可生成静态图像

axkjgtzd  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(175)

我尝试在binder上共享一个github repo。在本地,我使用matplotlib和@interact的交互式绘图工作正常。在活页夹上,它工作了一半。当滑块值改变时,相同的代码将静态图像添加到活页夹笔记本的单元格输出中。
问题:如何修复活页夹行为并制作交互式打印?
git存储库https://github.com/queezz/Complex_Numbers
我的笔记本看起来像这样:

%pylab inline
from ipywidgets import interact, widgets
x = np.linspace(0,np.pi,100)
@interact
def plot_interactive(a=widgets.FloatSlider(min=1, max=10, val=1)):
    plot(x,np.sin(x*a))
    gca().set_aspect('equal')
    ylim(-1.1,1.1)

截图自活页夹:

2ic8powd

2ic8powd1#

找到了一个很好的工作示例:https://github.com/Kapernikov/ipywidgets-tutorial
其要点是使用%matplotlib widget@widgets.interact
现在似乎不鼓励使用%pylab inline了,请看这个git问题。
我从教程中复制了一部分代码,它产生的结果与问题中想要的结果相同。

%matplotlib widget
import ipywidgets as widgets
import matplotlib.pyplot as plt
import numpy as np
# set up plot
fig, ax = plt.subplots(figsize=(6, 4))
ax.set_ylim([-4, 4])
ax.grid(True)

# generate x values
x = np.linspace(0, 2 * np.pi, 300)

def my_sine(x, w, amp, phi):
    """
    Return a sine for x with angular frequeny w and amplitude amp.
    """
    return amp*np.sin(w * (x-phi))

@widgets.interact(w=(0, 10, 1), amp=(0, 4, .1), phi=(0, 2*np.pi+0.01, 0.01))
def update(w = 1.0, amp=1, phi=0):
    """Remove old lines from plot and plot new one"""
    [l.remove() for l in ax.lines]
    ax.plot(x, my_sine(x, w, amp, phi), color='C0')
0s0u357o

0s0u357o2#

今天没能得到@queez用"互动"来工作的答案(2023年初更新后见下图);然而,ipywidgets文档目前包含了一个matplotlib示例,它使用了'interactive',我可以使用它并修改@qqueezz的solution来使其工作,这似乎是一个更精简的交互式绘图方法。

#%matplotlib inline # from the example in the documentation. but doesn't seem necessary in current JupyterLab 3.1.11 or the classic notebook available now https://github.com/fomightez/communication_voila
from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np

def my_sine(x, w, amp, phi):
    """
    Return a sine for x with angular frequency w and amplitude amp.
    """
    return amp*np.sin(w * (x-phi))

def f( w, amp, phi):
    plt.figure(2)
    x = np.linspace(0, 2 * np.pi, 300)
    plt.plot(x, my_sine(x, w, amp, phi), color='C0')
    #plt.ylim(-5, 5)
    plt.grid(True) #optional grid
    plt.show()

interactive_plot = interactive(f, w=(0, 10, 1), amp=(0, 4, .1), phi=(0, 2*np.pi+0.01, 0.01))
#output = interactive_plot.children[-1]
#output.layout.height = '450px'
interactive_plot

您可以转到存储库here,通过选择"以笔记本模式开始的直接链接:"下的"以笔记本形式开始matplotlib & widget演示"右侧的launch binder标记来启动会话。
或者单击here通过MyBinder直接启动到该笔记本。

    • 更新**:

后来(2023年初),我在JupyterLab中使用ipympl发现queez在Kapernikov: Ipywidgets with matplotlib中的代码确实可以与interact一起工作。
还没有跟上变化的东西;但是他想指出。

相关问题