使用Bokeh实时绘图,根据数值改变点的颜色

3

我正在使用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()

这是数据的外观。 模拟数据 接下来,我使用以下代码片段将数据实时推送到服务器。
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非常陌生),任何帮助都将不胜感激。 我的数据时间序列
1个回答

0

当您推送数据时,必须按所需颜色将组分开,并将相应的颜色作为调色板提供。https://github.com/bokeh/bokeh/issues/1967 上有一个更长的讨论,其中包含几个变体,例如 bryevdv 在 2月28日发布的简单 boteh.charts 点示例:

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 'change color' plot"。如果这些都不能解决您的问题,那么您需要区分您正在做的事情与已经存在的答案。

谢谢。我正在查看答案,但是它们中没有一个提供如何_real_time_执行的提示。在您的示例中,您正在操作可以提供调色板的Dot对象。在我的情况下,操作发生在循环内部,我正在更新数据源对象。似乎数据源对象仅允许更新数据而不是颜色。也许,我仍然缺少一些明显的东西,但我还没有能够弄清楚。关键是针对每个传入的数据点实时执行它。 - Snejana Shegheva
你需要在绘制后重新分类一个点吗,还是只需要在进行时添加颜色?你有上限来指定一个人为的大调色板,但只使用你所需的颜色吗?你能承受使用扩展数据集重新绘制吗? - Prune
我需要随时添加颜色。在上面的示例中,我模拟了所有数据点,但在实际系统中,情况并非如此。是的,我可以重新绘制扩展数据集,因为我将保持最大窗口。您是否建议为每个传入的数据点创建一个新的Dot对象(或任何绘图对象),而不是更新DataSource对象?如果是这样,我会尝试一下...谢谢 - Snejana Shegheva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接