Совместный участок для групповых данных о сиборне

#pandas #seaborn #subplot #facet-grid #jointplot

Вопрос:

У меня есть фрейм данных, который выглядит так:

 In[1]: df.head()
Out[1]:
dataset  x     y
   1     56   45
   1     31   67
   7     22   85
   2     90   45
   2     15   42
 

Есть еще около 4000 строк. x и y сгруппированы по наборам данных. Я пытаюсь построить совместную диаграмму для каждого набора данных отдельно, используя seaborn. Это то, что я могу придумать до сих пор:

 import seaborn as sns

g = sns.FacetGrid(df, col="dataset", col_wrap=3)
g.map_dataframe(sns.scatterplot, x="x", y="y", color = "#7db4a2")
g.map_dataframe(sns.histplot, x="x", color = "#7db4a2")
g.map_dataframe(sns.histplot, y="y", color = "#7db4a2")
g.add_legend();
 

но там все перекрывается. Как сделать правильный совместный график для каждого набора данных в подзаголовке? Заранее благодарю вас и ура!

Комментарии:

1. Обновите до версии seaborn 0.11.2 и используйте seaborn.jointplot : sns.jointplot(data=df, x='x', y='y', hue='dataset') . Кроме того, сетка фасетов-это график на уровне фигур, в настоящее время нет возможности иметь подфигуры.

2. Хмм. Как вы предлагаете мне решить эту проблему?

Ответ №1:

Вы можете использовать groupby столбец набора данных, затем использовать sns.jointgrid() , а затем, наконец, добавить точечную диаграмму и диаграмму KDE в сетку соединений.

Вот пример использования генератора случайных чисел с numpy. Я сделал три «набора данных» и произвольные значения x,y. Способы настройки цветов и т.д. см. в документации Seaborn jointgrid .

 ### Build an example dataset
np.random.seed(seed=1)
ds = (np.arange(3)).tolist()*10
x = np.random.randint(100, size=(60)).tolist()
y = np.random.randint(20, size=(60)).tolist()
df = pd.DataFrame(data=zip(ds, x, y), columns=["ds", "x", "y"])

### The plots
for _ds, group in df.groupby('ds'):
    group = group.copy()
    g = sns.JointGrid(data=group, x='x', y='y')
    g.plot(sns.scatterplot, sns.kdeplot)
 

введите описание изображения здесь