Если я вас правильно понимаю, вам нужно 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')
Если вы хотите, вы можете наложить 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)