我正在尝试使用Bokeh创建堆积条形图。我想使用悬停功能,在条形的每个部分显示相关数据,而不是Bokeh显示的数据' ???'。
我在一个名为"示例工作表"的excel文件中获得了数据,名为" Sales"。表格如下:
Year Category Sales
2016 A 1
2016 B 1
2016 C 1.5
2017 A 2
2017 B 3
2017 C 1
2018 A 2.5
2018 B 3
2018 C 2
我尝试运行以下代码:
import numpy as np
import scipy as sp
from bokeh.charts import Bar, output_file, show
from bokeh.models import HoverTool
import pandas as pd
x = pd.read_excel('Example worksheet.xlsx', 'Sales')
bar = Bar(x, label = 'Year', values = 'Sales', agg = 'sum', stack = 'Category', tools='hover')
hover = bar.select(dict(type=HoverTool))
source = x
hover.tooltips = [('Category', '@Category'),('Sales', '@Sales')]
output_file("Expected Sales.html")
show(bar)
在运行之后,我在Python控制台中收到以下消息(我不认为它与该主题相关,但无论如何我都说过了):
(process:4789): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed
然后在浏览器上我得到以下图表:
如您所见,数据被问号取代。我在FF 41.0.1和Chromium 45.0.2454.101上得到了这个结果,在Ubuntu 15.04(64位)上运行。
我阅读了Bokeh教程http://bokeh.pydata.org/en/latest/docs/user_guide/tools.html#hovertool,但它没有引用条形图。我也在Stackoverflow上发现了这个: Bokeh hover tooltip not displaying all data - Ipython notebook。 问题可能是相关的,但坦率地说,我并不完全理解答案。
答案 0 :(得分:4)
我遇到了同样的问题。我发现this reference很有用。 Sales的工具提示将使用通用@height
,例如:
hover.tooltips = [('Sales', '@height')]
同样,将@height
替换为@y
可以获得每年的总销售额。我还没想出如何使用工具提示来访问堆叠的类别或如何使用链接中引用的ColumnDataSource。
答案 1 :(得分:1)
我能够重新创建您的问题并找到了解决方案。首先,重新创建你的DF:
data = [k.split() for k in
'''2016 A 1
2016 B 1
2016 C 1.5
2017 A 2
2017 B 3
2017 C 1
2018 A 2.5
2018 B 3
2018 C 2'''.split('\n')]
x = pd.DataFrame(data, columns = ['year','category','sales'])
x['year'] = x['year'].astype(object)
x['sales'] = x['sales'].astype(float)
现在的解决方案:
from bokeh.charts import Bar, output_file, show
from bokeh.models import HoverTool
from bokeh.models import ColumnDataSource
source = ColumnDataSource(x)
bar = Bar(x, label='year', values='sales', agg='sum', stack='category', title="Expected Sales by year", tools = 'hover')
hover = bar.select(dict(type=HoverTool))
hover.tooltips = [('Year', '@x'),('Sales', '@y')]
show(bar)
产生以下图表:
增加:
class ColumnDataSource(* args,** kw)
可能是解决方案中最重要的部分(您可以阅读更多相关信息here)。