Holoviews:从分组条形图的 x 轴上删除变量名称

Holoviews: Remove variables names from x axis on grouped bar chart

关于 HoloViews 分组(非堆叠)条形图的快速问题。如何删除 x 轴变量名称刻度,但将它们包含在图例中?

请看下面的例子:

我想做以下事情:

  1. 对于红色框,删除刻度的名称 "x" 和 "y"
  2. 为 "x" 和 "y" 添加图例,使其与各自的颜色对齐。

代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import holoviews as hv
pd.options.plotting.backend = 'holoviews'

df1 = pd.DataFrame({
    'x': np.random.rand(10), 
    'y': np.random.rand(10),
})

my_plot = df1.plot(kind='bar')
my_plot

谢谢!

据我搜索,pandas plot with holoview (bokeh) 不提供您想要的样式。条形图没有图例,组图在 x 标签中有名称。

相反,使用 matplotlib 作为后端很容易。

import pandas as pd
import numpy as np

pd.options.plotting.backend = 'matplotlib'

df1 = pd.DataFrame({
                    'x': np.random.rand(10), 
                    'y': np.random.rand(10)
                    })

Plot = df1.plot(kind = 'bar', rot=0)
Plot

如果您编辑 Bokeh 目录,它会提供 setting legends and xlabels manually.

问题 1:从分组条形图中删除 xticks:

通常您可以 your_plot.opts(xticks=[(None)]) 删除 xticks,但不幸的是,这对于分组条形图是不可能的。

1 的解决方案:将您的图渲染为散景图,然后删除 xticks:

from bokeh.plotting import show

# create holoviews plot
my_holoviews_plot = df1.plot(kind='bar')

# render holoviews plot to bokeh plot
my_bokeh_plot = hv.render(my_holoviews_plot, backend='bokeh')

# apply changes to bokeh plot
my_bokeh_plot.xaxis.major_label_text_font_size = '0pt'

# visualize plot
show(my_bokeh_plot)



问题二:给分组条形图添加图例:
仍在寻找这个问题的答案。我认为这也必须使用 Bokeh 才能实现。
在这里查看我的问题:https://discourse.bokeh.org/t/add-legend-afterwards-to-bokeh-plot/4519/3


(给自己的心理提示:在 jupyter 中,您可以通过在 my_bokeh_plot. 之后按 tab 键来深入了解 my_bokeh_plot 的许多属性,但另一个好方法是 运行 my_bokeh_plot.properties_with_values()对于更困难的属性)。

您可以在您的分组条形图上使用 .opts(multi_level=False)
这将删除次要分类变量的 x-ticks 并向分组的条形图添加图例。

但是,为此您需要 HoloViews >=1.13。
在我撰写本文时,此版本尚不可用,但您可以通过以下方式安装:

pip install git+https://github.com/holoviz/holoviews.git


代码示例:

import numpy as np
import pandas as pd
import holoviews as hv
pd.options.plotting.backend = 'holoviews'

df1 = pd.DataFrame({
    'x': np.random.rand(10), 
    'y': np.random.rand(10),
})

my_grouped_barplot = df1.plot(kind='bar')

# remove the 2nd categorical level with multi_level=False
# this will remove your x-ticks and add a legend
my_grouped_barplot.opts(multi_level=False)


结果图: