Как я могу создать сгруппированную гистограмму с Matplotlib или Seaborn из мультииндексированного фрейма данных? - PullRequest
0 голосов
/ 19 сентября 2019

У меня проблема с отображением многоиндексированных данных на одной гистограмме.Я начал с DataFrame с тремя столбцами (artist, genre и miscl_count) и 195 строками.Затем я сгруппировал данные по двум столбцам, что привело к приведенной ниже таблице.Мой вопрос, как я могу создать гистограмму из этого, чтобы каждая группа в "miscl_count" отображалась в виде трех отдельных гистограмм во всех пяти жанрах (т.е. общее количество баров 3х5)?Я также хотел бы, чтобы жанр определял, какой цвет назначается полосе.

Я знаю, что есть расстановка стеков, но я не понимаю, как заставить это работать с Matplotlib или Seaborn.

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

print(miscl_df.head())

          artist     miscl_count      genre
0          band1               5          a
1          band2               6          b
2          band3               5          b
3          band4               4          b
4          band5               5          b
5          band6               5          c

miscl_df_group = miscl_df.groupby(['genre', 'miscl_count']).count()
print(miscl_df_group)

После группировки по, вывод выглядит так:

        artist        
miscl_count       4   5   6
genre                      
a                11   9   9
b                19  13  16
c                13  14  16
d                10   9  12
e                21  14  10

Просто чтобы сделатьуверен, я ясно дал понять, что вывод должен быть представлен в виде одной диаграммы (а не в виде вспомогательных участков)!

Рабочее решение, которое будет использоваться для сгруппированных данных:

miscl_df_group.unstack(level='genre').plot(kind='bar')

В качестве альтернативы этотакже можно использовать так:

miscl_df_group.unstack(level='miscl_count').plot(kind='bar')

1 Ответ

0 голосов
/ 19 сентября 2019

с seaborn, нет необходимости группировать данные, это делается под капотом:

import seaborn as sns

sns.barplot(x="artist", y="miscl_count", hue="genre", data=miscl_df)

(изменить имена столбцов по желанию, в зависимости от того, что вы хотите)

# full working example
import numpy as np
import pandas as pd
import seaborn as sns

df = pd.DataFrame()
df["artist"] = list(map(lambda i: f"band{i}", np.random.randint(1,4,size=(100,))))
df["genre"] = list(map(lambda i: f"genre{i}", np.random.randint(1,6,size=(100,))))
df["count"] = np.random.randint(50,100,size=(100,))

# df
#     count    genre artist
# 0      97   genre9  band1
# 1      95   genre7  band1
# 2      65   genre3  band2
# 3      81   genre1  band1
# 4      58  genre10  band1
# ..    ...      ...    ...
# 95     61   genre1  band2
# 96     53   genre9  band2
# 97     55   genre9  band1
# 98     94   genre1  band2
# 99     85   genre8  band1

# [100 rows x 3 columns]


sns.barplot(x="artist", y="count", hue="genre", data=df)

For 3 artists and 5 genres, this is the result...

...