将HoloViews VLine与PyViz Panel audio.time同步

我想在HoloViews图中可视化当前音频在图形中。更改PyViz的pn.pane.Audio.time值时(播放音频或更改Audio.time时),该行应自动更新。

我的尝试:

# Python 3.7 in JupyterLab
import numpy as np
import holoviews as hv  # interactive plots
hv.notebook_extension("bokeh")
import panel as pn
pn.extension()
from holoviews.streams import Stream,param

# create sound
sps = 44100 # Samples per second
duration = 10 # Duration in seconds
modulator_frequency = 2.0
carrier_frequency = 120.0
modulation_index = 2.0

time = np.arange(sps*duration) / sps
modulator = np.sin(2.0 * np.pi * modulator_frequency * time) * modulation_index
carrier = np.sin(2.0 * np.pi * carrier_frequency * time)
waveform = np.sin(2. * np.pi * (carrier_frequency * time + modulator))
waveform_quiet = waveform * 0.3
waveform_int = np.int16(waveform_quiet * 32767)

# PyViz Panel's Audio widget to play sound
audio = pn.pane.Audio(waveform_int,sample_rate=sps)
# generated plotting data
x = np.arange(11.0)
y = np.arange(11.0,0.0,-1) / 10
y[0::2] *= -1  # alternate positve-negative
# HoloViews line plot
line_plot = hv.Curve((x,y)).opts(width=500)

# should keep track of audio.time; DOES NOT WORK
Time = Stream.define('Time',t=param.Number(default=0.0,doc='A time parameter'))
time = Time(t=audio.time)

# callback to draw line when time value changes
def interactive_play(t):
    return hv.VLine(t).opts(color='green')

# dynamic map plot of line for current audio time
dmap_time = hv.DynamicMap(interactive_play,streams=[time])

# display Audio pane
display(audio)
# combine plot with stream of audio.time
line_plot * dmap_time

为什么这不起作用?

由于时间设置为param.Number(),所以我希望它能跟踪audio.time。因此,在播放音频时,应不断调用interactive_play()的回调,从而使Line在整个情节上移动。 这不会发生,并且该行仅保持默认值0.0(或代码执行时audio.time的任何其他值)。

如何更新VLine以保持跟踪audio.time

绿线应与“音频”窗格的时间匹配

将HoloViews VLine与PyViz Panel audio.time同步

GoDolphinboy 回答:将HoloViews VLine与PyViz Panel audio.time同步

  

由于将时间设置为param.Number(),所以我希望它可以跟踪audio.time。

在您的示例中,您没有以任何方式将Panel Audio对象链接到流。当您这样做时,您正在做的所有事情:

time = Time(t=audio.time)

已将Time流的初始值设置为“音频窗格”的当前值。 audio.time不是对该参数的引用,它只是该参数的当前值。

HoloViews DynamicMaps已经支持侦听其他对象参数已有一段时间了。可以通过以下两种主要方法进行此操作:

@pn.depends(t=audio.param.time)
def interactive_play(t):
    return hv.VLine(t).opts(color='green')

dmap_time = hv.DynamicMap(interactive_play)

在这里,您要通过依赖于interactive_play参数来装饰audio.time函数,以便每当它更改时,都会更新DynamicMap。这样做的更明确的方法以及内部实际发生的事情是:

from holoviews.streams import Params

def interactive_play(t):
    return hv.VLine(t).opts(color='green')

stream = Params(parameters=[audio.param.time],rename={'time': 't'})
dmap_time = hv.DynamicMap(interactive_play,streams=[stream])

如果您需要使用新文件更新“音频”窗格,我强烈建议您使用回调来执行此操作,而不是使用交互或反应式API不断创建新的音频窗格。这样,您也不必将流更新为不断变化的“音频”窗格。

本文链接:https://www.f2er.com/3024156.html

大家都在问