Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在无限循环中更新Bokeh图形,而不是绘制无限多的图形_Python_Infinite Loop_Bokeh - Fatal编程技术网

Python 在无限循环中更新Bokeh图形,而不是绘制无限多的图形

Python 在无限循环中更新Bokeh图形,而不是绘制无限多的图形,python,infinite-loop,bokeh,Python,Infinite Loop,Bokeh,我想画出一条声音流。我已经将变量total_数据定义为一个固定长度的数组,然后使用索引在每个循环中更新它。我在我的循环中尝试了showp,但这一直在我的浏览器上打开新的选项卡。我试图更新每个循环的图形,而不是创建一个新的循环。 我们将非常感谢您提供的任何建议,以及关于如何更有效地做到这一点的任何想法。 这是我的代码副本: #imports import pyaudio import numpy as np from bokeh.plotting import figure, output_fil

我想画出一条声音流。我已经将变量total_数据定义为一个固定长度的数组,然后使用索引在每个循环中更新它。我在我的循环中尝试了showp,但这一直在我的浏览器上打开新的选项卡。我试图更新每个循环的图形,而不是创建一个新的循环。 我们将非常感谢您提供的任何建议,以及关于如何更有效地做到这一点的任何想法。 这是我的代码副本:

#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()
show将始终打开新的选项卡或浏览器窗口,这是它的明确目的。如果要保持单个页面的打开和更新,基本上只有几个选项:

您可以创建和部署一个。事实上,您正在使用的流已经指向这个流,它只在Bokeh服务器应用程序的上下文中起作用。您可以在此处看到一个流媒体应用示例:。您可以通过执行以下命令在本地运行此应用程序

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

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

python ajax_source.py
在这种情况下,Python中没有无限循环。一旦您在浏览器中查看HTML文件,其中的JavaScript代码就会开始按照您配置的间隔从您配置的REST端点提取数据

最近,还有一个ServerSentDataSource,它类似于AjaxDataSource的推送版本

如果您想像上面那样在自己的流程中运行无限循环,可以调用save而不是show将HTML文件保存到磁盘。或者使用中的一个嵌入函数生成嵌入输出。不管是哪种方式,您都必须想出一些其他方法来让页面定期刷新Bokeh可以自动进行内容更新的方法如上所述