Python Bokeh -- 通过使用 DataFrame 列将 HoverToolTip 合并到条形图中
Python Bokeh -- Incorporate HoverToolTip into Bar Chart by using DataFrame Columns
我的目标是创建一个代表直方图的散景条形图。理想情况下,我希望启用 hovertooltips,以便将鼠标悬停在列上将显示该点的总累计值。
我的原始数据框看起来像这样:
Buckets Data1_% Data2_%
0 (0.0166, 0.283] 16.886842 17.242004
1 (0.3, 0.32] 1.111779 1.284348
为了用 Data1_% 和 Data2_% 的并排视图制作条形图,我需要按以下方式调用 pd.melt():
df_temp = pd.melt(df, id_vars = "Buckets", value_vars = ["Data1_%", "Data2_%"])
然后使数据框看起来像这样:
Buckets variable value
0 (0.0166, 0.283] Data1_% 16.886842
1 (0.3, 0.32] Data1_% 1.111779
其中 "variable" 包含 "Data1_%" 或 "Data2_%" 作为两个可能的项目。
最后,我生成了我的绘图并尝试以这种方式绘制它:
bar = Bar(df_temp, label = "Buckets", values = "value", group = "variable")
bar.add_tools(HoverTool(tooltips = [("TestValue", "@value")]))
show(bar)
条形图呈现良好,如下所示:
这正是我想要的!悬停工具已启用并且有效,但它始终显示“???”作为价值,这意味着它并没有像我想的那样从我的数据框(df_temp)中提取。
理想情况下,它会显示两个数据点:"variable" 字段的值以及 "value" 字段的值。
所以对于我的第一个数据点,我希望它显示:
变量:Data1_%
值:16.886842
等等。但我会很高兴让 value 参数起作用。
如有任何提示,我们将不胜感激!我已经尝试阅读有关将我的数据框更改为 ColumnDataSource 和其他此类技巧的文档,但我真的很高兴看到一些有关如何使这项工作起作用的代码。
谢谢!
编辑:快速跟进问题。我如何在我的 BokehChart 上强制执行排序?我希望数据按照我在数据框中列出的相同顺序显示,但似乎 Bokeh 有时会混淆这些值并以看似随机的顺序吐出。我认为 Bokeh 应该很容易与 Dataframes 一起使用!
旧的 bokeh.charts
,包括 Bar
已被弃用并随后被删除。要在 Bokeh 中创建直方图(带有工具提示),您应该使用稳定的 bokeh.plotting
API。有多种可能的方法可以做到这一点,但这里是一个使用 Bokeh 创建的完整示例 0.13.0
:
import numpy as np
from bokeh.plotting import figure, show
measured = np.random.normal(0, 0.5, 1000)
hist, edge = np.histogram(measured, density=True, bins=50)
p = figure(tooltips="top: @top")
p.quad(top=hist, bottom=0, left=edge[:-1], right=edge[1:], line_color="white")
show(p)
我的目标是创建一个代表直方图的散景条形图。理想情况下,我希望启用 hovertooltips,以便将鼠标悬停在列上将显示该点的总累计值。
我的原始数据框看起来像这样:
Buckets Data1_% Data2_%
0 (0.0166, 0.283] 16.886842 17.242004
1 (0.3, 0.32] 1.111779 1.284348
为了用 Data1_% 和 Data2_% 的并排视图制作条形图,我需要按以下方式调用 pd.melt():
df_temp = pd.melt(df, id_vars = "Buckets", value_vars = ["Data1_%", "Data2_%"])
然后使数据框看起来像这样:
Buckets variable value
0 (0.0166, 0.283] Data1_% 16.886842
1 (0.3, 0.32] Data1_% 1.111779
其中 "variable" 包含 "Data1_%" 或 "Data2_%" 作为两个可能的项目。
最后,我生成了我的绘图并尝试以这种方式绘制它:
bar = Bar(df_temp, label = "Buckets", values = "value", group = "variable")
bar.add_tools(HoverTool(tooltips = [("TestValue", "@value")]))
show(bar)
条形图呈现良好,如下所示:
这正是我想要的!悬停工具已启用并且有效,但它始终显示“???”作为价值,这意味着它并没有像我想的那样从我的数据框(df_temp)中提取。
理想情况下,它会显示两个数据点:"variable" 字段的值以及 "value" 字段的值。
所以对于我的第一个数据点,我希望它显示:
变量:Data1_% 值:16.886842
等等。但我会很高兴让 value 参数起作用。
如有任何提示,我们将不胜感激!我已经尝试阅读有关将我的数据框更改为 ColumnDataSource 和其他此类技巧的文档,但我真的很高兴看到一些有关如何使这项工作起作用的代码。
谢谢!
编辑:快速跟进问题。我如何在我的 BokehChart 上强制执行排序?我希望数据按照我在数据框中列出的相同顺序显示,但似乎 Bokeh 有时会混淆这些值并以看似随机的顺序吐出。我认为 Bokeh 应该很容易与 Dataframes 一起使用!
旧的 bokeh.charts
,包括 Bar
已被弃用并随后被删除。要在 Bokeh 中创建直方图(带有工具提示),您应该使用稳定的 bokeh.plotting
API。有多种可能的方法可以做到这一点,但这里是一个使用 Bokeh 创建的完整示例 0.13.0
:
import numpy as np
from bokeh.plotting import figure, show
measured = np.random.normal(0, 0.5, 1000)
hist, edge = np.histogram(measured, density=True, bins=50)
p = figure(tooltips="top: @top")
p.quad(top=hist, bottom=0, left=edge[:-1], right=edge[1:], line_color="white")
show(p)