我在
HOLOVIEWS
中面临这个问题,我无法按照我的 df
上的方式获取图像上的条形顺序。我也尝试了很多方法order
和sort
但都失败了。显示的图像与预期的顺序完全相反。
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
N
,Y
..(从上到下)。依此类推。我也不想对要排序的变量进行编码,因为我有一个很大的 df
和很多 sets
,并且很难给出变量代码中要排序的名称,如果我要创建一个 function
,那也是没有意义的
如果要对外部索引进行排序,可以在
.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)
默认情况下不遵守的顺序被认为是一个错误,并且很可能最终会被修复。
作为解决方法,您可以使用
轻松反转轴的顺序your_plot.opts(invert_yaxis=True)
在您的情况下,只需在 opts 上添加 invert_yaxis=True 即可。
count_bars
plot = (
count_bars.opts(hooks=[hook1],
title="IDs",invert_axes=True, width=500, padding=2, invert_yaxis=True))
作为快速修复/解决方法,我已将索引反转为按
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, kdims=["set","flag"], vdims="id").redim.values(set=order,flag=order1)