Сгруппированная гистограмма Pandas

У меня есть таблица в pandas DataFrame с именем df:

+--- -----+------------+-------------+----------+------------+-----------+
|avg_views| avg_orders | max_views   |max_orders| min_views  |min_orders |
+---------+------------+-------------+----------+------------+-----------+
| 23       | 123       |   135       | 500      |    3       |    1      |
+---------+------------+-------------+----------+------------+-----------+ 

Сейчас я ищу, чтобы построить сгруппированную гистограмму, которая показывает мне (среднее, максимальное, минимальное) просмотров и заказов в одной гистограмме.

т. е. по оси x будут просмотры и заказы, разделенные расстоянием и 3 столбцами (среднее, максимальное, минимальное) для просмотров и аналогично для заказов.

Я прикрепил образец изображения гистограммы, просто чтобы знать, как должна выглядеть гистограмма.

«просто Зеленый цвет должен быть для среднего, желтый для максимального и розовый для среднего.

Я взял следующий код из установки интервала между сгруппированными гистограммами в matplotlib но у меня не работает:

plt.figure(figsize=(13, 7), dpi=300)

groups = [[23, 135, 3], [123, 500, 1]]
group_labels = ['views', 'orders']
num_items = len(group_labels)
ind = np.arange(num_items)
margin = 0.05
width = (1. - 2. * margin) / num_items

s = plt.subplot(1, 1, 1)
for num, vals in enumerate(groups):
    print 'plotting: ', vals
    # The position of the xdata must be calculated for each of the two data 
    # series.
    xdata = ind + margin + (num * width)
    # Removing the "align=center" feature will left align graphs, which is 
    # what this method of calculating positions assumes.
    gene_rects = plt.bar(xdata, vals, width)
s.set_xticks(ind + 0.5)
s.set_xticklabels(group_labels)

plotting: [23, 135, 3] ... ValueError: несоответствие формы: объекты не могут транслироваться в одну форму


person Shubham R    schedule 04.11.2016    source источник
comment
Можете ли вы предоставить минимально воспроизводимый пример?   -  person IanS    schedule 04.11.2016
comment
@IanS проверьте, я добавил код   -  person Shubham R    schedule 04.11.2016
comment
Как это не работает? Сообщение об ошибке?   -  person IanS    schedule 04.11.2016


Ответы (2)


Использование панд:

import pandas as pd

groups = [[23,135,3], [123,500,1]]
group_labels = ['views', 'orders']

# Convert data to pandas DataFrame.
df = pd.DataFrame(groups, index=group_labels).T

# Plot.
pd.concat(
    [df.mean().rename('average'), df.min().rename('min'), 
     df.max().rename('max')],
    axis=1).plot.bar()

Результат графика

person IanS    schedule 04.11.2016
comment
работал как шарм! только один вопрос, это только что дало мне гистограмму, есть ли способ фактически поместить мое значение в верхнюю часть каждого столбца. скажем, немного выше бара для максимального заказа, могу ли я указать его стоимость? - person Shubham R; 04.11.2016
comment
Боюсь, я не знаю, как это сделать. Попробуйте этот ответ, возможно... - person IanS; 04.11.2016
comment
Или непосредственно из документации (см. autolabel). - person IanS; 04.11.2016

Вам не нужно изменять свой фрейм данных только для того, чтобы построить его определенным образом, верно?

Используйте Seaborn!

import seaborn as sns


sns.catplot(x = "x",       # x variable name
            y = "y",       # y variable name
            hue = "type",  # group variable name
            data = df,     # dataframe to plot
            kind = "bar")

источник

person Thomas G.    schedule 03.04.2020