бок о бок с несколькими Pandas DataFrames - PullRequest
1 голос
/ 08 июня 2019

Несмотря на несколько хороших предыдущих примеров на этом сайте, мне не удалось создать боксы бок о бок для нескольких панелей данных в одном графике.

Я пробовал это:

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

df = pd.DataFrame({'A1':[9,16.2,8.1],'A2':[3.3,21.5,4.1],
                   'B1':[8,9.8,1.6],'B2':[10.8,2.2,3.6],
                   'C1':[1.3,2.8,1.6],'C2':[3.1,4.1,3.6],})

df1 = df.loc[:, 'A1':'A2']
df2 = df.loc[:, 'B1':'B2']
df3 = df.loc[:, 'C1':'C2']

fig = matplotlib.pyplot.boxplot(df1)
fig = matplotlib.pyplot.boxplot(df2)
fig = matplotlib.pyplot.boxplot(df3)
plt.show()

enter image description here

Но я бы хотел что-то вроде этого:

enter image description here

Кроме того, было бы неплохо, если бы я мог отображать отдельные точки данных в виде точек в полях. Так что, если у кого-то тоже есть на это предложение, было бы здорово!

Спасибо!

1 Ответ

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

Если я вас правильно понимаю, вам нужно 6 коробочных участков с 3 группами по 2 (каждая группа A / B / C и внутри каждой группы у вас 1/2)?

Вы можете довольно легко достичь желаемого результата, используя seabord, но вы должны сначала выполнить рефакторинг своего фрейма данных в «длинной форме». Сначала я использую pd.wide_to_long(), чтобы разделить данные на 3 группы A / B / C с новым столбцом, идентифицирующим подгруппы 1/2, затем я далее melt результирующий кадр данных в получить длинную форму данных:

df = pd.DataFrame({'A1':[9,16.2,8.1],'A2':[3.3,21.5,4.1],
                   'B1':[8,9.8,1.6],'B2':[10.8,2.2,3.6],
                   'C1':[1.3,2.8,1.6],'C2':[3.1,4.1,3.6],})

df["id"] = df.index
df = pd.wide_to_long(df, stubnames=['A','B','C'], i='id', j='group').reset_index().drop('id', axis=1)
df = df.melt(id_vars='group')

Полученный кадр данных теперь выглядит так:

    group   variable    value
0   1   A   9.0
1   1   A   16.2
2   1   A   8.1
3   2   A   3.3
4   2   A   21.5
5   2   A   4.1
6   1   B   8.0
7   1   B   9.8
8   1   B   1.6
9   2   B   10.8
10  2   B   2.2
11  2   B   3.6
12  1   C   1.3
13  1   C   2.8
14  1   C   1.6
15  2   C   3.1
16  2   C   4.1
17  2   C   3.6

Тогда тривиально использовать seaborn's boxplot для генерации сюжета:

sns.boxplot(data=df, x='variable', y='value', hue='group')

enter image description here

Если вы хотите, вы можете наложить Swarmplot поверх коробочного поля, чтобы увидеть отдельные точки данных

sns.boxplot(data=df, x='variable', y='value', hue='group')
sns.swarmplot(data=df, x='variable', y='value', hue='group', dodge=True, palette=['grey','grey'], s=10)

enter image description here

...