我了解如何使交互功能适用于基本示例;但我试图将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))
我得到一个错误。我知道错误是什么,我的函数需要一个列表,但是w
和f
是浮点数(因此第一个错误是len()
,浮点数没有len
,第二个错误错误在zip
中,它们也不可迭代)。如何将w
和f
封装到列表中?
此外(如何),我可以做些什么来创建滑块的列表,而不是手动分别指定每个参数?
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风格),可以进行以下工作:
修改传递给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()
在对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理解为首先,它可以使用户更轻松地更改谐波数。