Как установить порядок баров в соответствии с порядком / индексом фрейма данных в Holoviews

Я столкнулся с этой проблемой в HOLOVIEWS, где в Im не удалось получить порядок полосок на изображении, как на моем 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)

Получаю получившееся изображение: -  введите описание изображения здесь

Я не хочу этого, я хочу, чтобы порядок был таким же, как и в моем фрейме данных в следующем порядке: -_ 10 _-_ 11 _, _ 12_, затем BALL _14 _, _ 15 _ .. (сверху вниз) и так далее. Я также не хочу закодировать переменные для упорядочивания, потому что у меня есть большой df с множеством sets, и было бы сложно упорядочить имена переменных в коде, а также это не будет иметь смысла, если я собираюсь создать function


person Scope    schedule 10.10.2020    source источник
comment
Помогает ли этот ответ: изменение stackoverflow.com/questions/59735494/   -  person Sander van den Oord    schedule 10.10.2020
comment
Я уже видел это перед тем, как задавать вопрос. Это не помогает   -  person Scope    schedule 11.10.2020


Ответы (2)


Если вы хотите отсортировать внешний индекс, вы можете использовать .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)

Производит:  введите описание изображения здесь

person Cameron Riddell    schedule 12.10.2020

В качестве быстрого исправления / обходного пути я изменил индекс, чтобы он отображался в порядке 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)
person Scope    schedule 11.10.2020