如何在python中绘制箱形图(一个图中有多个箱形图)

时间:2019-12-01 21:53:54

标签: python matplotlib

以下是我拥有的数据集的示例:

df = pd.DataFrame(np.array([[1,40], [2, 51], [3, 59], [4, 10], [5, 30], [7, 20], [9, 21], [13, 30], [15, 70], [2, 81]]),columns=['A', 'B')

基于A列中的值,我定义了三组:

Group_1A = df[(df['A'] >= 0) & (df['A'] <= 3)]
Group_2A = df[(df['A'] >= 4) & (df['A'] <= 7)]
Group_3A = df[(df['A'] >= 9) & (df['A'] <= 15)]

对于B列,我也分为以下三个组:

Group_1B = df[(df['B'] >= 10) & (df['B'] <= 30)]
Group_2B = df[(df['B'] >= 40) & (df['B'] <= 60)]
Group_3B = df[(df['B'] >= 70) & (df['B'] <= 100)]

现在,我需要一个可以同时显示所有9个方框图的图。像下面的图片。 enter image description here

我尝试使用seaborn.boxplot,并尝试查看是否可以分别绘制9个箱形图,然后将它们组合在一起,但是没有用。例如,我尝试根据group1A和1B定义一个新的数据集,如下所示:

df2 = Group_1A[Group_1A[(df['B'] >= 10) & (df['B'] <= 30)]] 
fig, ax = plt.subplots(figsize=(9,9))
ax = sns.boxplot(x="B",y="A", data=df2,ax=ax)#,order=order)

这仅给我一个箱形图(当A处于[0-3]范围内且B处于[10-30]范围内时)。  enter image description here

我想知道是否有人可以帮助我。

预先感谢

1 个答案:

答案 0 :(得分:1)

您是否要为每个组绘制“ B”的分布?

此代码提供的内容类似于您提供的图形,但是我可能误解了这个问题。

df = pd.DataFrame(np.array([[1,40], [2, 51], [3, 59], [4, 10], [5, 30], [7, 20], [9, 21], [13, 30], [15, 70], [2, 81]]),columns=['A', 'B'])
lim_A = [[0,3],[4,7],[9,15]]
lim_B = [[10,30],[40,60],[70,100]]


fig, ax = plt.subplots()
boxes = []
for ypos,a in enumerate(lim_A):
    for b in lim_B:
        temp = df.loc[(df.A>=a[0])&(df.A<=a[1])&(df.B>=b[0])&(df.B<=b[1])]
        boxes.append(ax.boxplot(temp['B'].values, vert=False, positions=[ypos]))

ax.set_ylim(-0.5,(len(lim_A)-1)+0.5)
ax.set_yticks(range(len(lim_A)))
ax.set_yticklabels([f'[{a}–{b}]' for a,b in lim_A])

ax.set_xticks([np.mean(a) for a in lim_B])
ax.set_xticklabels([f'[{a}–{b}]' for a,b in lim_B])

ax.set_xlabel('B')
ax.set_ylabel('A')

enter image description here