根据Bokeh

时间:2015-10-04 16:08:40

标签: python plot time-series real-time bokeh

我在实验中使用Bokeh实时绘制数据,并且库提供了一种方便的方法。

这是我完成此任务的代码片段:

# do the imports 
import pandas as pd
import numpy as np
import time
from bokeh.plotting import *
from bokeh.models import ColumnDataSource

# here is simulated fake time series data
ts = pd.date_range("8:00", "10:00", freq="5S")
ts.name = 'timestamp'
ms = pd.Series(np.arange(0, len(ts)), index=ts)
ms.name = 'measurement'
data = pd.DataFrame(ms)
data['state'] = np.random.choice(3, len(ts))
data['observation'] = np.random.choice(2, len(ts))
data.reset_index(inplace=True)
data.head()

这就是数据的样子。 simulated data

接下来,我使用以下剪辑将数据实时推送到服务器

output_server("observation")

p = figure(plot_width=800, plot_height=400, x_axis_type="datetime")
x = np.array(data.head(2).timestamp, dtype=np.datetime64)
y = np.array(data.head(2).observation)
p.diamond_cross(x,y, size=30, fill_color=None, line_width=2,      name='observation')
show(p)

renderer = p.select(dict(name="observation"))[0]
ds = renderer.data_source

for mes in range(len(data)):

    x = np.append(x, np.datetime64(data.loc[mes].timestamp))
    y = np.append(y, np.int64(data.loc[mes].observation))
    ds.data["x"] = x
    ds.data["y"] = y

    ds._dirty = True
    cursession().store_objects(ds)
    time.sleep(.1)

这会产生非常好的结果,但我需要更改以值为条件的每个数据点的颜色。

在这种情况下,条件是状态变量,它取三个值 - 0,1和2.所以我的数据应该能够反映出来。 我花了好几个小时试图解决它(不可否认我是Bokeh的新手),任何帮助将不胜感激。

my data time series

1 个答案:

答案 0 :(得分:0)

按下数据时,必须按所需颜色分隔组,然后将相应的颜色作为调色板提供。在https://github.com/bokeh/bokeh/issues/1967进行了多次变体讨论,例如2月28日发布的简单boteh.charts点示例bryevdv:

cat = ['foo', 'bar', 'baz']
xyvalues=dict(x=[1,4,5], y=[2,7,3], z=[3,4,5])
dots = Dot(
    xyvalues, cat=cat, title="Data", 
    ylabel='FP Rate', xlabel='Vendors',
    legend=False, palette=["red", "green", "blue"])
show(dots)

请务必阅读并遵守https://stackoverflow.com/help/how-to-ask的发布指南;我在第一次搜索时发现了这个和其他一些可能有用的点击," Bokeh'改变颜色'情节&#34 ;.如果这些都无法解决您的问题,您需要将您正在做的事情与已经存在的答案区分开来。