Bokeh服务器图未根据需要进行更新,它还会不断移动并且轴信息消失

问题描述 投票:0回答:1

一旦单击“刷新按钮”,我想用新数据更新图。但是旧的数据仍然保留在图中,并且它一直向右下移,刻度消失了。

首先,该图看起来像我期望的(除了X轴信息。作为一个副问题,II在Bokeh属性中查找了DataSpec(),但不确定如何将accept_datetime=False传递给x线图中的实参。我的代码看起来像这样。

数据目录看起来像

root-|
     |-weeklydata1.pkl
     |-weeklydata2.pkl
     |-datashow.py

Here是腌制的数据文件。

from bokeh.layouts import column, row
from bokeh.models.widgets import Button
from bokeh.plotting import figure, show
from pandas import *

# Callbacks
def update_data():
    # Set up plot
    global p
    global f
    # p = figure(title="testing plot")

    # Set up data
    # weeklybdxdata(1)
    print("reading new data")
    df1 = read_pickle('weeklydata2.pkl')
    for j in df1.columns:
        p.line(df1.index,
               df1[j],
               legend=j,
               line_color=f[j])
        p.circle(df1.index,
                 df1[j],
                 size=10,
                 color=f[j])
    return p

# Set up data
df =read_pickle('weeklydata1.pkl')
f = dict(OAT='green', SAT='orange', OAH='red')

# Set up plot
p = figure(title="testing plot")

for i in df.columns:
    p.line(df.index,
           df[i],
           legend=i,
           line_color=f[i])
    p.circle(df.index,
             df[i],
             size=10,
             color=f[i])

# Set up widgets
button = Button(label='Refresh')
button.on_click(update_data)
inputs = column(button)

curdoc().add_root(row(inputs, p, width=800))
curdoc().title = "Test Plot"

我避免使用bokeh.models.ColumnDataSource,因为我找不到如何传递数据帧的好例子。

我用bokeh serve datashow.py启动代码后,初始图看起来像这样(小抱怨:但是x轴以毫秒为单位)

enter image description here

单击刷新后,连续刷新多次后,图形不断移动,轴信息消失。

 enter image description here

我使用的是Bokeh 1.4.0的最新版本

bokeh pandas-bokeh
1个回答
0
投票

默认情况下,Bokeh在所有可用字形上自动调整范围。上面的代码将无限地累积新的字形。因此,您看到的结果是预期的。您可以尝试在更新功能中主动删除以前的圆形和直线字形,但是我不建议这样做。最佳化Bokeh的最佳方法是update绘制图的最佳方法是设置所有字形once,然后再为它们仅更新data

即,您需要直接使用ColumnDataSource。我注意到你说:

我避免使用bokeh.models.ColumnDataSource,因为找不到关于如何传递数据帧的良好示例。

我不确定你在看什么。在文档和repo的examples文件夹中都有很多同时使用CDS和Pandas的示例。您可以通过直接修改DataFrame来初始化CDS:

source = ColumnDataSource(df)

然后,当您想更新source时,可以做;

source = ColumnDataSource.from_df(new_df)

小抓地力:但x轴以毫秒为单位

您当然可以使用日期时间轴,如果那是您想要的:

https://docs.bokeh.org/en/latest/docs/user_guide/plotting.html#datetime-axes

© www.soinside.com 2019 - 2024. All rights reserved.