Измените порядок баров в сгруппированном барплоте с помощью hvplot / holoviews - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь создать гистограмму сгруппированных, но не могу понять, как повлиять на порядок гистограммы.

Учитывая данные этого примера:

import pandas as pd
import hvplot.pandas

df = pd.DataFrame({
    "lu": [200, 100, 10], 
    "le": [220, 80, 130], 
    "la": [60, 20, 15], 
    "group": [1, 2, 2],
})
df = df.groupby("group").sum()

Я хотел бы создать горизонтальный сгруппированный столбчатый график, показывающий две группы 1 и 2 со всеми тремя столбцами. Столбцы должны отображаться в порядке «le», «la» и «lu».

Естественно, я бы попробовал это с Hvplot:

df.hvplot.barh(x = "group", y = ["le", "la", "lu"])

С этим я получаю результат ниже: grouped barplot in wrong order hvplot

Похоже, что Hvplot не заботится о порядке добавления столбцов (вызов df.hvplot.barh(x = "group", y = ["lu", "le", "la"]) ничего не меняет. При этом Hvplot не заботится об оригинале порядок в кадре данных.

Есть ли варианты влияния на порядок баров?

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Для обычных гистограмм вы можете просто упорядочить данные так, как вы хотите, чтобы они отображались.
Однако для сгруппированных гистограмм вы еще не можете установить порядок.
Но разработка этой функции уже началась и, вероятно, доступна в одном из следующих выпусков: https://github.com/holoviz/holoviews/issues/3799

Современные решения с Hvplot 0.5.2 и Holoviews 1.12:

1) Если вы используете серверную часть Bokeh Вы можете использовать зацепки для ключевых слов :

from itertools import product

# define hook function to set order on bokeh plot
def set_grouped_barplot_order(plot, element):
    # define you categorical ordering in a list of tuples
    factors = product(['2', '1'], ['le', 'la', 'lu'])

    # since you're using horizontal bar set order on y_range.factors
    # if you would have had a normal (vertical) barplot you would use x_range.factors
    plot.state.y_range.factors = [*factors]

# create plot    
group = df.groupby("group").sum()
group_plot = group.hvplot.barh(
    x="group",
    y=["le", "la", "lu"],
    padding=0.05,
)

# apply your special ordering function
group_plot.opts(hooks=[set_grouped_barplot_order], backend='bokeh')

С помощью зацепок можно применять определенные c настройки боке к вашим графикам. Вам не нужны крючки очень часто, но они очень удобны в этом случае. Документация:
http://holoviews.org/user_guide/Customizing_Plots.html#Plot - крючки
https://holoviews.org/FAQ.html


2) Другое решение будет преобразовывать ваш график Holoviews в реальный график Bokeh, а затем установить порядок:

from itertools import product
import holoviews as hv
from bokeh.plotting import show

# create plot
group = df.groupby("group").sum()
group_plot = group.hvplot.barh(
    x="group",
    y=["le", "la", "lu"],
    padding=0.05,
)

# render your holoviews plot as a bokeh plot
my_bokeh_plot = hv.render(group_plot, backend='bokeh')

# set the custom ordering on your bokeh plot
factors = product(['2', '1'], ['le', 'la', 'lu'])
my_bokeh_plot.y_range.factors = [*factors]

show(my_bokeh_plot)

Лично я предпочитаю первое решение, потому что оно остается в пределах Holoviews.

Итоговый участок: customized categorical axes in grouped barcharts using keyword hooks

1 голос
/ 16 января 2020

Это было исправлено в HoloViews 1.13 .

Вы можете сортировать свой барплот так, как вы хотели:

df.hvplot.barh(x="group", y=["lu", "la", "le"])


Пока я пишу это, HoloViews 1.13 официально еще не доступен, но вы можете установить его через :

pip install git + https://github.com/holoviz/holoviews.git


Если вы хотите еще больше контролировать заказ, Вы можете использовать .redim.values ​​() в вашем grouped_barplot:

group_specific_order = [2, 1]
variable_specific_order = ['lu', 'la', 'le']

# Note that group and Variable are the variable names of your dimensions here
# when you use this on a different grouped barchart, then please change to the 
# names of your own dimensions.
your_grouped_barplot.redim.values(
    group=group_specific_order, 
    Variable=variable_specific_order,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...