如何根据Holoviews中数据框的顺序/索引设置条形顺序

问题描述

我在HOlovIEWS中遇到此问题,在该问题中,我无法像在我的df上那样获得图像上条形的顺序。我也尝试了多种方法ordersort,但都失败了。显示的图像与预期的顺序完全相反。

df = pd.DataFrame({
    "set": list("ABABCCAD"),"flag": list("YYNNNYNY"),"id": list("DEFGHIJK"),})
df["set"] = df["set"].map(
    {"A": "APPLE","B": "BALL","C": "CAT","D": "DOG"
    }
)

这是生成df:-

    set   flag  id
0   APPLE   N   2
1   APPLE   Y   1
2   BALL    N   1
3   BALL    Y   1
4   CAT     N   1
5   CAT     Y   1
6   DOG     Y   1

我想要我的图片与此df

相同的顺序
def hook1(plot,element):
    plot.state.y_range.range_padding = 0.1

   
plot.state.text(
    y="xoffsets",x="id",text="id",source=plot.handles["source"],text_align="left",y_offset=10,x_offset=5    
)

df= df.groupby(["set","flag"])["id"].count().reset_index()
count_bars = hv.Bars(df,kdims=["set","flag"],vdims="id")


plot = (
count_bars.opts(hooks=[hook1],title="IDs",invert_axes=True,width=500,padding=2))
bokeh_obj = hv.render(plot,backend="bokeh")
show(bokeh_obj)

我得到的图像是:-

enter image description here

我不希望这样,我希望该顺序与数据框的顺序相同:-APPLE-NY,然后是{{ 1}} BALLN ..(从上到下)等等。我也不想对变量进行编码,因为我有一个很大的{{1} },其中包含许多Y,很难在代码中赋予变量名称顺序,而且如果我要创建df

也是没有意义的

解决方法

如果要对外部索引进行排序,则可以在.sort(dimension,reverse=True)对象上使用hv.Bars。但是,对内部索引进行排序将需要您显式设置维度值:

from bokeh.io import show
import holoviews as hv
hv.extension("bokeh")


df = df.groupby(["set","flag"])["id"].count().reset_index()
count_bars = hv.Bars(df,kdims=["set","flag"],vdims="id")

plot = (count_bars
        .opts(hooks=[hook1],title="IDs",invert_axes=True,width=500,padding=2)
        .redim.values(flag=["Y","N"]) # Inverting the axes flips this order. This produces N,Y vertically
        .sort("set",reverse=True)
       )

bokeh_obj = hv.render(plot,backend="bokeh")
show(bokeh_obj)

产生: enter image description here

,

作为一种快速解决方案/解决方法,我已将索引按df的顺序反转,但是我认为以后应该在holoviews中进行修复

    df['indexn'] = df.index
    df.indexn = df.indexn.values[::-1]
    order = df.sort_values(by='indexn').set
    order1 = df.sort_values(by='indexn').flag
    count_bars = hv.Bars(df,vdims="id").redim.values(set=order,flag=order1)