繁体   English   中英

使用 hvplot/holoviews 在堆叠条 plot 中反转图例顺序

[英]Reverse legend order in stacked bar plot using hvplot/holoviews

我正在尝试使用 hvplot 或 holoviews 反转堆叠条 plot 中图例项的顺序。 启用堆叠条中的图例 plot 以与堆叠方式相反的顺序显示项目。 人们会期望它们的顺序相同。

似乎在将全息视图 plot 渲染为散景 plot 后,无法使用my_bokeh_plot.legend.items访问各个图例项目。 我只得到一个图例项[LegendItem(id='1374', ...)] 这意味着我无法使用p.legend[0].items.reverse()恢复图例项目的顺序。 我想这是因为 hvplot 和 holoviews 使用了散景的“groupby legends” 使用散景作为后端时,如何恢复图例条目的顺序?

这是一个 hvplot 示例:

import pandas as pd
import hvplot.pandas
from bokeh.plotting import show
import holoviews as hv

df = pd.DataFrame({
    'Type': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'Fiscal Period': ['2019-01', '2019-01', '2019-02', '2019-02', '2019-01', '2019-01', '2019-02', '2019-02'],
    'Request Type': ['S', 'D', 'S', 'D', 'S', 'D', 'S', 'D'],
    'values': range(1, 9),
    })

layout = df.hvplot.bar(
    x='Fiscal Period', 
    y='values', 
    by='Request Type', 
    groupby='Type', 
    stacked=True, 
    cmap='Category20', 
    legend='top_left',
    frame_width=200,
    ).layout()

plotA = layout['A'].opts(title='Type: A')

my_bokeh_plot = hv.render(plotA, backend='bokeh')

my_bokeh_plot.legend[0].items.reverse()

show(my_bokeh_plot)

这里有一张图片:
在此处输入图像描述

到目前为止我发现的相关讨论:
https://github.com/bokeh/bokeh/issues/9135

一种解决方案是使用 hvplot 的matplotlib 后端(随hvplot 0.8.0发布),然后使用 matplotlib 反转图例顺序

对于您的示例代码,它将是:

import pandas as pd
import hvplot.pandas
import holoviews as hv

hv.extension('matplotlib') # use matplotlib backend

df = pd.DataFrame({
    'Type': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'Fiscal Period': ['2019-01', '2019-01', '2019-02', '2019-02', '2019-01', '2019-01', '2019-02', '2019-02'],
    'Request Type': ['S', 'D', 'S', 'D', 'S', 'D', 'S', 'D'],
    'values': range(1, 9),
    })

layout = df.hvplot.bar(
    x='Fiscal Period', 
    y='values', 
    by='Request Type', 
    groupby='Type', 
    stacked=True, 
    cmap='Category20', 
    legend='top_left',
    frame_width=200,
    ).layout()

plotA = layout['A'].opts(title='Type: A')

fig = hv.render(plotA)

# Reverse legend order
ax = fig.axes[0]
title = ax.get_legend()._legend_title_box._text.get_text() # Access legend title
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], title = title)

fig

输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM