一旦单击“刷新按钮”,我想用新数据更新图。但是旧的数据仍然保留在图中,并且它一直向右下移,刻度消失了。
首先,该图看起来像我期望的(除了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轴以毫秒为单位)
单击刷新后,连续刷新多次后,图形不断移动,轴信息消失。
我使用的是Bokeh 1.4.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
或