Python笔记本交互式,列表作为参数?

时间:2018-08-19 18:30:43

标签: jupyter-notebook python-3.6 interactive

我了解如何使交互功能适用于基本示例;但我试图将FloatSliders()的列表作为参数传递。如何做到这一点?还是不可能?例如:我有两个非常简单的函数,可以绘制不同频率和偏移的正弦曲线。

import numpy as np
from numpy import pi, cos, sin, linspace
import matplotlib.pyplot as plt 
from tsCluster.cyclicAnalysis import cyclic_analysis
from ipywidgets import interactive
from ipywidgets import FloatSlider

def harmonics(w,f):
    """Returns a list of harmonics on interval 0-10 """

    assert len(f) == len(w)   
    t = linspace(0,10,100)
    harmonics = list()

    for (wk,fk) in zip(w,f):
        harmonics.append(sin(wk*t +fk))

    return harmonics, t

def plotter(w,f):
    """Plots a bunch of harmonics given frequencies & offsets. """
    plt.figure()
    x, t = harmonics(w,f)
    for xk in x:
        plt.plot(t,xk)
    plt.show()

例如,调用plotter([1],[2])导致绘制正弦曲线,或者plotter([1,2,3],[4,5,6])导致绘制三个正弦曲线。现在的问题,

如果我通过:

interactive_plot = interactive(plotter, w=(-2.0, 2.0), f=(-3, 3, 0.5))

我得到一个错误。我知道错误是什么,我的函数需要一个列表,但是wf是浮点数(因此第一个错误是len(),浮点数没有len,第二个错误错误在zip中,它们也不可迭代)。如何将wf封装到列表中?

此外(如何),我可以做些什么来创建滑块的列表,而不是手动分别指定每个参数?

ws = list()
fs = list()

for _ in range(3):
    ws.append(FloatSlider(min=0, max=3))
    fs.append(FloatSlider(min=-3, max=3))

这会导致错误,实际上我认为IPython最终创建了一个带有三个Dropdown作为选项的FloatSlider小部件。我将单独添加,因为我认为如果执行ws = [FloatSlider(min=0, max=3)]*3,它们最终都将指向同一Slider对象。


更新: 我目前还无法实现滑块列表方法,但是出于我的目的(只需进行最小的更改并使其保持某种Python风格),可以进行以下工作:

  1. 修改传递给interactive的/和函数的签名:

    def绘图仪(w0,w1,w2,f0,f1,f2):     “”“根据给定的频率和偏移量绘制一堆谐波。”“”

    plt.figure()
    w, f = [w0, w1, w2], [f0, f1, f2]
    x, t = harmonics(w, f)
    for xk in x:
        plt.plot(t, xk)
    plt.show()
    
  2. 在对interactive的调用中使用** kwargs:

    freqs = ['w0', 'w1', 'w2']
    phases = ['f0', 'f1', 'f2']
    kwargs = dict()
    
    for freq in freqs:
        kwargs[freq] = FloatSlider(min=0, max=3)
    
    for phase in phases:
        kwargs[phase]  = FloatSlider(min=-3, max=3)
    
    interactive_plot = interactive(plotter, **kwargs)
    

如果有人 使滑条方法列表起作用,那将非常酷,因为IMO就是您将python理解为首先,它可以使用户更轻松地更改谐波数。

0 个答案:

没有答案