Python 3.x 使用ipython小部件操纵绘图,这些绘图在无限循环中不断更新
在ipython笔记本中,我尝试使用Jupyter做一个计算,它在一个while循环中运行了很长一段时间。我使用pyplot显示我的计算的当前状态,我希望能够通过ipywidgets与计算和绘图进行通信。例如,这可以是用于计算的停止按钮,也可以是调整绘图更新率的滑块 下面我展示了一个sin函数的最小示例,它不断地以不同的相移绘制。“开始”按钮开始计算,“停止”按钮停止计算,滑块应调整整个更新的速度。文本框显示当前相移Python 3.x 使用ipython小部件操纵绘图,这些绘图在无限循环中不断更新,python-3.x,jupyter-notebook,ipython-parallel,ipywidgets,Python 3.x,Jupyter Notebook,Ipython Parallel,Ipywidgets,在ipython笔记本中,我尝试使用Jupyter做一个计算,它在一个while循环中运行了很长一段时间。我使用pyplot显示我的计算的当前状态,我希望能够通过ipywidgets与计算和绘图进行通信。例如,这可以是用于计算的停止按钮,也可以是调整绘图更新率的滑块 下面我展示了一个sin函数的最小示例,它不断地以不同的相移绘制。“开始”按钮开始计算,“停止”按钮停止计算,滑块应调整整个更新的速度。文本框显示当前相移 import numpy as np import matplotlib.py
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import *
import IPython.display as display
import _thread
import time
%matplotlib nbagg
# set up widgets
buttons = widgets.ToggleButtons(
options=['Stop', 'Start'],
description='',
disabled=False,
)
text = widgets.Text(
value='0',
placeholder='',
description='Shift [rad]',
)
speed_slider = widgets.IntSlider(
description = "Speed",
value = 100,
min = 10,
max = 500,
step = 10,
)
container = widgets.HBox(children = [buttons, speed_slider, text])
display.display(container)
# functions
def mySin(x, x0):
return np.sin(x-x0)
def run_app(x, dx0):
x0 = np.remainder(np.float(text.value), 2*np.pi)
while buttons.value == buttons.options[1]:
x0 = np.remainder(x0 + dx0, 2*np.pi)
line.set_ydata(mySin(x, x0))
text.value = str(x0)
time.sleep(speed_slider.value/1000)
fig.canvas.draw()
# setup plot
N = 1000
x = np.linspace(0, 10*np.pi, N)
dx0 = 0.05*2*np.pi
fig, ax = plt.subplots(ncols = 1, nrows = 1, figsize = (8,3))
line = ax.plot(x, mySin(x, np.float(text.value)))[0]
# act on button change
def buttons_on_changed(val):
if buttons.value == buttons.options[1]:
_thread.start_new_thread(run_app, (x, dx0))
buttons.observe(buttons_on_changed)
我尝试在新线程中运行函数“run_app”,以使交互成为可能。我知道thread已经被弃用了,但我想首先知道,这是否是正确的方法。上面的例子或多或少可以工作,但执行会在几秒钟后停止,或者当我在笔记本中执行其他操作(滚动、单击等)时停止。因此,我的问题如下: