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

3

我正在尝试使用hvplot或holoviews反转堆积条形图中图例项的顺序。在堆积条形图中启用图例会显示与它们堆叠的顺序相反的项。人们希望它们按相同的顺序排列。

似乎在将holoviews绘图渲染为bokeh绘图后,无法使用my_bokeh_plot.legend.items访问单独的图例项。我只得到一个单独的图例项[LegendItem(id='1374', ...)]。这意味着我不能使用p.legend[0].items.reverse()恢复图例项的顺序。我想这是因为hvplot和holoviews使用了bokeh的一种“分组图例”。当使用bokeh作为后端时,如何恢复图例条目的顺序?

这里有一个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


这个问题解决了吗?我也遇到了同样的问题。 - manu
1
目前似乎还不行:https://github.com/holoviz/holoviews/issues/4799 - mouwsy
1个回答

1
一种解决方案是使用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

output


1
您需要的hvplot版本应该比0.8.0更加新,这个版本增加了对matplotlib后端的支持。https://hvplot.holoviz.org/releases.html#version-0-8-0 - Hebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接