создать графики плотности непрерывного поля по категориальному полю - PullRequest
0 голосов
/ 05 июня 2019

У меня есть код ниже, который перекрывает кривую плотности на гистограмме.Это делается для поля «Fresh» в моих данных, которое является непрерывным полем.Я хотел бы создать аналогичные фильтры по уникальным значениям в поле «Канал».Например, в пандах для создания гистограмм, похожих на то, что я пытаюсь выполнить, я бы использовал:

data_df.hist(column=‘Fresh’,by=‘Channel’)

Кто-нибудь может подсказать, как сделать что-то похожее для кода seaborn ниже?

код:

import seaborn as sns

sns.distplot(data_df[‘Fresh’], hist=True, kde=True, 
                             bins=int(data_df.shape[0]/5), color = 'darkblue', 
                             hist_kws={'edgecolor':'black'},
                             kde_kws={'linewidth': 4})

данные

  Channel  Fresh
0        2  12669
1        2   7057
2        2   6353
3        1  13265
4        2  22615
5        2   9413
6        2  12126
7        2   7579
8        1   5963
9        2   6006

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Я думаю, что способ Seaborn - создать FacetGrid, а затем map функцию построения графика на уровне оси.В вашем случае:

g = sns.FacetGrid(data_df, col='Channel', margin_titles=True)
g.map(sns.distplot, 
      'Fresh',
      bins=int(data_df.shape[0]/5),
      color='darkblue', 
      hist_kws={'edgecolor': 'black'},
      kde_kws={'linewidth': 4});

Histograms with KDEs faceted using sns.FacetGrid

Проверьте документы для получения дополнительной информации: https://seaborn.pydata.org/tutorial/axis_grids.html

0 голосов
/ 05 июня 2019

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

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data_df = pd.DataFrame({'Channel': [2, 2, 2, 1, 2, 2, 2, 2, 1, 2],
                        'Fresh': [12669,  7057,  6353, 13265, 22615,  
                                  9413, 12126,  7579,  5963,6006]})
df1 = data_df.groupby('Channel')

fig, axes = plt.subplots(nrows=1, ncols=len(df1), figsize=(10, 3))

for ax, df in zip(axes.flatten(), df1.groups):
    sns.distplot(df1.get_group(df)['Fresh'], hist=True, kde=True, 
                             bins=int(data_df.shape[0]/5), color = 'darkblue', 
                             hist_kws={'edgecolor':'black'},
                             kde_kws={'linewidth': 4}, ax=ax)

plt.tight_layout()    

enter image description here

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