问题描述
我在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
,然后是{{ 1}} BALL
,N
..(从上到下)等等。我也不想对变量进行编码,因为我有一个很大的{{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)
,
作为一种快速解决方案/解决方法,我已将索引按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)