[英]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.