Как построить гистограмму с накоплением, используя hvplot? - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь построить столбчатую диаграмму с накоплением с 3 категориальными переменными и 1 числовой переменной, используя hvplot.

Кто-нибудь знает, как правильно построить диаграмму с накоплением?
Тип запроса «D» и «S» не отображаются разными цветами.

Данные:
image of data with 3 categories and 1 numerical value

Мой код :

by_type = test_df.groupby(['Type', 'Fiscal Period', 'Request Type']).agg({'Count': np.sum})
plot_by_type = by_type.hvplot.bar('Type','Count', by=['Fiscal Period', 'Request Type'], stacked=False, 
                                    flip_xaxis=False, ylabel='Total Count', invert=False,
                                                     cmap=['silver', 'goldenrod'])
plot_by_type

Ниже приводится график, который я получаю: image of data with 3 categories and 1 numerical value

1 Ответ

0 голосов
/ 30 января 2020

В настоящее время в HoloViews (1.13) невозможно иметь более 2 категориальных переменных для диаграммы.

См. Также эту проблему github:
https://github.com/holoviz/holoviews/issues/2878

Однако вы можете сделать обходной путь, подобный следующему:
Хитрость заключается в том, чтобы поместить одну категориальную в качестве x, одну категориальную переменную в ключевое слово by и другие категориальные переменные в ключевом слове groupby.

import pandas as pd
import hvplot.pandas

# create sample data
df = pd.DataFrame({
    'Type': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'Fiscal Period': ['2019-01', '2019-01', '2019-02', '2019-02', '2019-01', '2019-01', '2019-02', '2019-02'],
    'Request Type': ['S', 'D', 'S', 'D', 'S', 'D', 'S', 'D'],
    'values': range(1, 9),
})

# create a separate barchart per Type
layout = df.hvplot.bar(
    x='Fiscal Period', 
    y='values', 
    by='Request Type', 
    groupby='Type', 
    stacked=True, 
    cmap='Category20', 
    legend='top_left',
    width=400,
    xlabel='',
).layout()

# make plots nicer so they look more like a clustered barchart
plotA = layout['A'].opts(title='Type: A')
plotB = layout['B'].opts(show_legend=False, yaxis=None, ylabel='', title='Type: B')

# add separate plots together again
(plotA + plotB).opts(title='Showing the counts per Fiscal Period, Request Type and Type')



Результирующий график:

workaround for barchart with 3 categorical variables

В качестве бонуса этот код даст вам тот же результат, что и выше:

def create_subplot(type_selected):
    plot = df[df['Type'] == type_selected].hvplot.bar(
        x='Fiscal Period', 
        y='values', 
        by='Request Type', 
        stacked=True, 
        cmap='Category20', 
        label='Type: ' + type_selected,
        legend='top_left',
        width=400,
        xlabel='',
        ylabel='',
    )
    return plot

plotA = create_subplot('A')
plotB = create_subplot('B').opts(show_legend=False, yaxis=None)

(plotA + plotB).opts(title='Showing the counts per Fiscal Period, Request Type and Type')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...