首页 > 解决方案 > 如何根据 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)

我得到了结果图像:- 在此处输入图像描述

我不希望这样,我希望顺序与我的数据框的顺序相同:- APPLE- N,,Y然后 BALL NY..(从上到下)。等等。我也不想要对要排序的变量进行编码,因为我有df很多sets,而且很难在代码中给出要排序的变量名称,而且如果我要创建一个也没有意义function

标签: pythondataframeplotholoviews

解决方案


如果要对外部索引进行排序,可以.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)

产生: 在此处输入图像描述


推荐阅读