Как нарисовать несколько уровней групповых гистограмм в Python? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть такой фрейм данных,

col1    col2     col3    
A       east        5      
A       west        7
A       east        1
A       east        6
B       east        2
B       west        9
B       east        8
...
Z       west        4

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

df[df.col1.isin(ix)].groupby('col1').hist()

Как я могу получить 2 уровня сгруппировать и нарисовать гистограммы с помощьюиспользуя вышеупомянутый фрейм данных? Для каждой col1 групповой гистограммы я хочу их на отдельном графике. Но для каждой col2 группы. Я надеюсь, что они в одном. enter image description here

Например, окончательные результаты будут 26 гистограммами из A-Z. Каждый внутри имеет 2 участка (east&west).

Ответы [ 2 ]

1 голос
/ 01 октября 2019

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

Данные:

import string
import numpy as np
import pandas as pd
import random

alpha_list = [random.choice(list(string.ascii_uppercase)) for _ in range(10_000)]
coor_list = [random.choice(['east', 'west']) for _ in range(10_000)]
rand_val = [np.random.randint(10) for _ in range(10_000)]
df = pd.DataFrame({'col1': alpha_list, 'col2': coor_list, 'col3': rand_val})
df.sort_values(by='col1', inplace=True)

col1  col2  col3
   A  west     1
   A  east     3
   A  west     9
   A  west     5
   A  west     7
   A  east     1
   A  east     5
   A  west     2
   A  east     2
   A  west     2

График:

g = sns.FacetGrid(df, col='col1', hue='col2', col_wrap=7)
g.map(sns.distplot, 'col3', hist_kws=dict(edgecolor='black'), bins=range(0, 11, 1), kde=False)
plt.xlabel('Value Range')
plt.ylabel('Frequency')
plt.legend()
plt.xticks(range(1, 11, 1))
plt.show()

enter image description here

  • , если вы хотите, чтобы на каждом графике были метки тиков, поместите следующий код в строку перед plt.show():
for ax in g.axes.flatten():
    ax.tick_params(labelbottom=True)

1 голос
/ 01 октября 2019

Вы можете поворачивать таблицу и групповой график:

df = pd.DataFrame({'col1': np.random.choice(('A','B'), size=100),
                   'col2': np.random.choice(('east', 'west'), size=100),
                   'col3': np.random.randint(0,10, 100)})

df['idx'] = df.groupby('col1').col2.cumcount()

(df.pivot_table(index=['idx','col1'], 
                columns=['col2'], 
                values='col3')
   .groupby('col1').plot.hist(subplots=False, alpha=0.5)

)

Выход:

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...