【问题标题】:Bokeh Hovertool stacked barchartBokeh Hovertool 堆叠条形图
【发布时间】:2020-05-05 07:37:23
【问题描述】:

我通过下面的代码构建了一个散景堆叠条形图。该图表显示了哥本哈根地区的不同树木类型。目前我有一个 hoverTool 显示树类型的 excat 数量(对应于具有树名称的列),但我也希望它显示百分比(最后带有 _p 的列),但是如何使用堆积条形图做到这一点?

数据框的缩减部分:

temp=pd.DataFrame( {'bydelsnavn': {0: 'Amager Vest', 1: 'Amager Øst', 2: 'Bispebjerg', 3: 'Brønshøj-Husum', 4: 'Indre By', 5: 'Nørrebro', 6: 'Valby', 7: 'Vanløse', 8: 'Vesterbro', 9: 'Østerbro'}, 'Alder': {0: 53.0, 1: 21.0, 2: 1.0, 3: 9.0, 4: 4.0, 5: 2.0, 6: 3.0, 7: 44.0, 8: 46.0, 9: 59.0}, 'Alderm': {0: 63.0, 1: 32.0, 2: 49.0, 3: 13.0, 4: 45.0, 5: 55.0, 6: 104.0, 7: 0.0, 8: 50.0, 9: 4.0}, 'Apple': {0: 94.0, 1: 109.0, 2: 115.0, 3: 12.0, 4: 22.0, 5: 81.0, 6: 41.0, 7: 3.0, 8: 132.0, 9: 51.0}, 'Alder_p': {0: 21.9, 1: 8.68, 2: 0.41, 3: 3.72, 4: 1.65, 5: 0.83, 6: 1.24, 7: 18.18, 8: 19.01, 9: 24.38}, 'Alderm_p': {0: 15.18, 1: 7.71, 2: 11.81, 3: 3.13, 4: 10.84, 5: 13.25, 6: 25.06, 7: 0.0, 8: 12.05, 9: 0.96}, 'Apple_p': {0: 14.24, 1: 16.52, 2: 17.42, 3: 1.82, 4: 3.33, 5: 12.27, 6: 6.21, 7: 0.45, 8: 20.0, 9: 7.73}})

我的代码:

treeName = ['Alder','Alderm','Apple']
treeName_p = ['Alder_p','Alderm_p','Apple_p']

colornames = named.__all__
colornames = colornames[:len(treeName)]

# Create an empty figure
p = figure(x_range = temp['bydelsnavn'].values,plot_width = 700, plot_height=400, 
           title='Tree pr. district', toolbar_sticky = False,
           tools = 'pan,wheel_zoom,reset')

# Stacked bar chart
renderers = p.vbar_stack(stackers=treeName,x='bydelsnavn',source=temp,
            width=0.8, color = colornames)

# Add the hover tool
for r in renderers:
    tree = r.name
    hover = HoverTool(tooltips=[
        ("%s" % tree, "@{%s}" % tree)
    ], renderers = [r])
    p.add_tools(hover)

# remove the grid
p.xgrid.grid_line_color=None
p.ygrid.grid_line_color=None
# Make sure bars stat at 0
p.y_range.start = 0
# remove - y-axis
p.yaxis.visible = False
# Remove the grey box around the plot
p.outline_line_color = None
# Turn the x-labels
p.xaxis.major_label_orientation = 0.5
# Remove tool bar logo
p.toolbar.logo = None
# Move the border of the left side to show "Amager"
p.min_border_left = 30

show(p)

我当前的图表如下所示:

【问题讨论】:

    标签: python bokeh


    【解决方案1】:

    假设_p 列的值实际上在数据源中,您可以在HoverTool 中添加另一个工具提示:

    for r in renderers:
        tree = r.name
        p.add_tools(HoverTool(tooltips=[(tree, "@$name"),
                                        (f"{tree} %", f"@{tree}_p")],
                              renderers=[r]))
    

    注意@$name 是如何在其中使用的——在这种特殊情况下不是必需的,但有时会派上用场。

    【讨论】:

    • 太棒了,谢谢! f(f"{tree} %", f"@{tree}_p") 中有什么特别之处?当我将它应用于整个数据集时,有一些树类型是几个词,例如:“Horse chestnut”,那么显示的数字就是???。通常我会将它包装在 {} 中,但在这种情况下我似乎无法让它工作。
    • 它被称为“F-strings”:python.org/dev/peps/pep-0498 % 语法是 Python
    • 关于??? - 抱歉,您可以使用f"@{{{tree}_p}}"。如果在 F 字符串中使用双精度 {{}},则结果为纯 {}。而 Bokeh 中的 {..} 可防止空格和特殊符号破坏占位符。
    • 如何限制小数位数?通常我会通过{0.0}。但是当我这样传递它时:(f"Out of all {tree} trees", f"@{{{tree}_p}}{0.0} %") 它只会添加更多的零。
    • 尝试使用{{0.0}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2023-01-31
    • 1970-01-01
    • 2019-06-18
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多