具有多个 Pandas 数据帧的并排箱线图
side-by-side boxplot with multiple Pandas DataFrames
尽管这个网站上有一些很好的例子,但我无法在一个图中为多个 pandas DataFrame 生成并排框。
我试过这个:
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()
但我想要这样的东西:
此外,如果我可以将各个数据点显示为框中的点,那就太好了。因此,如果有人对此也有建议,那就太好了!
谢谢!
如果我没理解错的话,你想要 6 个箱线图,每组 3 个,每组 2 个(每组 A/B/C,每组内有 1/2)?
您可以使用 seabord 相当轻松地获得所需的结果,但您必须首先在 "long form" 中重构您的数据框。
我首先使用 pd.wide_to_long()
to split the data in the 3 groups A/B/C with a new column identifying the subgroups 1/2, then I further 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')
如果需要,您可以在箱线图上叠加一个群图以查看各个数据点
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)
尽管这个网站上有一些很好的例子,但我无法在一个图中为多个 pandas DataFrame 生成并排框。
我试过这个:
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()
但我想要这样的东西:
此外,如果我可以将各个数据点显示为框中的点,那就太好了。因此,如果有人对此也有建议,那就太好了!
谢谢!
如果我没理解错的话,你想要 6 个箱线图,每组 3 个,每组 2 个(每组 A/B/C,每组内有 1/2)?
您可以使用 seabord 相当轻松地获得所需的结果,但您必须首先在 "long form" 中重构您的数据框。
我首先使用 pd.wide_to_long()
to split the data in the 3 groups A/B/C with a new column identifying the subgroups 1/2, then I further 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')
如果需要,您可以在箱线图上叠加一个群图以查看各个数据点
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)