在无限循环内更新散景图,而不是绘制无限数量的图

时间:2018-07-09 15:25:30

标签: python infinite-loop bokeh

我正在尝试绘制声音流。我已经将变量total_data定义为固定长度的数组,然后使用索引在每个循环中对其进行更新。我曾在循环中尝试过show(p),但这一直在浏览器中打开新标签页。我正在尝试更新每个循环的图,而不是创建一个新的图。 任何建议都将受到高度赞赏,任何想法都将以更有效的方式做到这一点。 这是我的代码的副本:

#imports
import pyaudio
import numpy as np
from bokeh.plotting import figure, output_file, show

#defining required parameters
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
MAX_PLOT_SIZE = CHUNK * 6
WAVE_OUTPUT_FILENAME = "VR_11.wav"

#create a variable of the class pyaudio
audio = pyaudio.PyAudio()

#allow user to choose which input to use
chosen_index=input('Insert index of required device:')
print('')
chosen_device=audio.get_device_info_by_index(int(chosen_index))
print('Chosen device is:', chosen_device)

# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
            rate=RATE, input=True,
            frames_per_buffer=CHUNK,input_device_index=int(chosen_index))
print("recording...")

#create fixed length array
total_data=np.zeros(MAX_PLOT_SIZE,dtype=np.int16)
output_file("VR_11.html")
x=np.linspace(0,MAX_PLOT_SIZE,MAX_PLOT_SIZE)

# create a new plot with a title and axis labels
p = figure(title="Live Voltage Plot", x_axis_label='', y_axis_label='Voltage 
Amplitude')


while True:
    data = stream.read(CHUNK)
    data_sample = np.frombuffer(data, dtype=np.int16)
    total_data[:(-CHUNK)] = total_data[CHUNK:]
    total_data[-CHUNK:] = data_sample
    p.line(x, total_data, legend="Sound Live Plot",line_color="navy", 
    line_width=2)
    #p.show()- hashed to stop infinite plots from showing up
# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()

1 个答案:

答案 0 :(得分:0)

show将始终打开新的标签页或浏览器窗口,这是其明确的目的。如果要保持单个页面的打开和更新,基本上只有几个选项:

  • 您可以创建和部署Bokeh Server application。您正在使用stream的事实已经指出了这一点-stream仅在Bokeh服务器应用程序的上下文中有效。您可以在此处查看示例流应用程序:Streaming OHLC demo。您可以通过执行

    在本地运行此应用
    bokeh serve ohlc
    

    您可以选择添加--show参数,以在服务器启动时直接向应用程序打开浏览器窗口。重要说明:在这种情况下,您 不使用无限循环 。如该示例所示,您将需要设置一个定期回调。

  • 如果要通过定期轮询的REST API获得要用于更新绘图的数据,则可以使用AjaxDataSource。这将允许您创建一个连续更新的独立HTML文档(即不是Bokeh服务器应用程序)。您可以在此处查看使用它的示例:ajax_source.py。您可以将其作为标准python脚本运行以生成HTML文件:

    python ajax_source.py
    

    在这种情况下,Python中没有无限循环。在浏览器中查看HTML文件后,其中的JavaScript代码将开始以您配置的间隔从您配置的REST端点中提取数据。

  • 如果要像上面一样在自己的进程中运行无限循环,可以调用save而不是show来将HTML文件保存到磁盘。或者,您可以使用bokeh.embed中的嵌入功能之一来生成嵌入输出。无论哪种方式,您都必须想出其他方法来使页面定期刷新(上面介绍了Bokeh可以使内容自动更新的方法)。