我在实验中使用 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。所以我的数据应该能够反射(reflect)这一点。 我花了几个小时试图弄明白(诚然,我是 Bokeh 的新手),我们将不胜感激任何帮助。
最佳答案
当您推送数据时,您必须按所需颜色将组分开,然后提供相应的颜色作为调色板。在 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 'change color' plot”时发现了这个和其他几个可能有用的结果。如果这些都不能解决您的问题,您需要将您正在做的事情与已有的答案区分开来。
关于python - 根据 Bokeh 实时绘图中的值更改点颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935525/