【问题标题】:Changing point color depending on value in real-time plotting with Bokeh根据 Bokeh 实时绘图中的值更改点颜色
【发布时间】:2015-10-04 16:08:39
【问题描述】:

我在一个实验中使用 Bokeh 来实时绘制数据,该库提供了一种方便的方法来做到这一点。

这是我完成此任务的代码的 sn-p:

# 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 很陌生),任何帮助都将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    当您推送数据时,您必须按所需颜色分隔组,然后提供相应的颜色作为调色板。在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 的发帖指南;在我的第一次搜索尝试“散景'改变颜色'情节”中,我发现了这个和其他几个可能有用的命中。如果这些都不能解决您的问题,您需要将您正在做的事情与已有的答案区分开来。

    【讨论】:

    • 谢谢。我正在查看答案,但没有一个提供关于如何做到这一点的提示 real_time。在您的示例中,您正在操作 Dot 对象,您可以在其中提供调色板。在我的情况下,动作发生在我更新数据源对象的循环内。似乎数据源对象只允许更新数据而不是颜色。也许,我仍然遗漏了一些明显的东西,但我无法弄清楚。关键是对每个传入的数据点进行实时处理。
    • 绘制后是否需要重新分类点,还是只是需要随时添加颜色?您是否有一个上限,允许您指定一个人为的大调色板,但只使用您需要的颜色?你能负担得起用扩展数据集重绘吗?
    • 我只需要添加颜色即可。在上面我模拟数据的示例中,所有数据点都是预先可用的,但在实际系统中并非如此。是的,我可以负担得起重新绘制扩展数据集的费用,因为我将保持最大窗口。您是否建议为每个传入数据点创建一个新的 Dot 对象(或我拥有的任何绘图对象)而不是更新 DataSource 对象?如果是这样的话,我会试一试...谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多