python - 在 Jupyter 笔记本中嵌入的 Bokeh 实时绘图中设置 x_axis_limit

标签 python bokeh jupyter

我想更改 x 轴范围作为 jupyter 中绘图更新的一部分。

我用于绘制时间序列的更新函数(line 是 multi_line 的实例):

def update_plot(meta, data, fig, line, window_length=3.0):
    fs = meta["format"]["sample rate"]
    data = np.asarray(data).transpose()[4:8]
    x, y = dsp.time_series(data, fs)
    x = np.tile(x, (y.shape[0], 1))
    line.data_source.data['xs'] = x.tolist()
    line.data_source.data['ys'] = y.tolist()
    if x.max() >= window_length:
        fig.x_range = Range1d(x.max() - window_length, x.max())
    push_notebook()

但是,虽然这会使用新数据更新绘图,但它实际上并未按预期设置 x 轴限制。我试过How can I accomplish `set_xlim` or `set_ylim` in Bokeh? 但它实际上并没有更新我的情节。一种选择是对绘制的数据进行切片,但是我希望在用户缩小时所有数据都可用。

最佳答案

这花了我一段时间才弄清楚,因为你所做的事情似乎很合理! (为了更好地理解,我在邮件列表上提出了这个问题)。

让它发挥作用非常简单,简而言之就是改变

fig.x_range = Range1d(x.max() - window_length, x.max())
push_notebook()

fig.x_range.start = x.max() - window_length
fig.x_range.end = x.max()
push_notebook()

这是一个完整的工作示例:

from ipywidgets import interact
import numpy as np

from bokeh.io import push_notebook
from bokeh.plotting import figure, show, output_notebook

x = np.linspace(0, 2*np.pi, 2000)
y = np.sin(x)

output_notebook()

p = figure(plot_height=300, plot_width=600, y_range=(-5,5))
p.line(x, y, color="#2222aa", line_width=3)

def update(range_max=6):
    p.x_range.end = range_max
    push_notebook()

show(p)

interact(update, range_max=(1,10))

笔记本在这里:http://nbviewer.jupyter.org/github/birdsarah/bokeh-miscellany/blob/master/How%20can%20I%20accomplish%20%60set_xlim%60%20or%20%60set_ylim%60%20in%20Bokeh%3F.ipynb

关于python - 在 Jupyter 笔记本中嵌入的 Bokeh 实时绘图中设置 x_axis_limit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35229507/

相关文章:

python - Django 注销不起作用 - 不明白为什么

julia - IJulia笔记本内核报错--Jupyter启动内核失败

python - 在 jupyter 笔记本中取消裁剪 3d 绘图

python - 验证值仍然导致类型错误?

python - Django channel : No module named 'asgiref.sync'

python - Bokeh 图上的多个 slider

python - Bokeh 中的时间序列流

python - Bokeh :AttributeError: 'DataFrame' 对象没有属性 'tolist'

python - jupyter 笔记本设置失败,错误代码为 “TypeError: __call__() takes exactly 2 arguments (1 given)”

python - 如何将管道运算符用作正则表达式的一部分?