【问题标题】:How to get any kind of interactive plot with ipywidgets and matplotlib如何使用 ipywidgets 和 matplotlib 获得任何类型的交互式绘图
【发布时间】:2021-08-08 02:38:38
【问题描述】:

我只是在寻找某种工作示例,它可以让我拥有一个滑块和一个正弦波图,从而我可以在 Jupyter Notebook 中改变频率。我用谷歌搜索的所有在线演示都不适合我。问题似乎是旧的 matplotlib 图在创建新图之前没有被删除。

这是我的最小示例

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

def f(a):
    clear_output(wait=True)
    fig, ax = plt.subplots()
    x = np.linspace(0, 2*np.pi, 100)
    y = np.sin(a*x)
    ax.grid()
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.plot(x,y)
    ax.set_title("y = sin(x)")

%matplotlib inline
from time import sleep
for i in range(1,10):
    clear_output(wait=True)
    f(i)
    sleep(1)

我也试过

out = widgets.Output(layout={'border': '1px solid black'})
with out:
    widgets.interact(f, a=1)
    out.clear_output()
    display(out)

但是,我尝试的任何方法都不会删除之前的 matplotlib 图。它们只是堆积在彼此之上。我承认我在挣扎,因为我不太了解 API,而且文档中的示例对我不起作用。

我不希望人们修复我的代码,因为它可能是垃圾。我只是在寻找一个工作示例,它可以让我以交互方式控制频率并在 Jupyter 笔记本上重绘正弦波。

【问题讨论】:

    标签: matplotlib jupyter-notebook ipywidgets


    【解决方案1】:

    这是一个对我有用的最小示例:

    from ipywidgets import interact
    import ipywidgets as widgets
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    def plot(freq):
        x = np.linspace(0, 2*np.pi)
        y = np.sin(x * freq)
        plt.plot(x, y)
    
    interact(plot, freq = widgets.FloatSlider(value=2, min=0.1, max=5, step=0.1))
    

    默认图:

    将滑块向右移动后的笔记本屏幕截图:

    【讨论】:

    • 当我这样做时,我什至没有滑块,我使用的是官方的 jupyter/scipy-notebook docker 映像。 ibb.co/gwHZWpR
    • 您是否正确安装并激活了 ipywidgets?在您的 shell 中,运行 pip install ipywidgetsjupyter nbextension enable --py widgetsnbextension
    • 小部件将使用 RangeSlider 显示,但不通过交互显示
    猜你喜欢
    • 2017-02-28
    • 2014-06-28
    • 1970-01-01
    • 2021-04-08
    • 2022-01-09
    • 2022-11-24
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多