首页 > 解决方案 > Matplotlib DataFrame 箱线图,具有给定的最大值、最小值和四分位数

问题描述

我想用我的 DataFrame 绘制一个箱线图:

     A     B     C
max  10    11    14
min  3     4     10
q1   5     6     12
q3   9     7     13

如何绘制具有这些固定值的箱线图?

标签: pythonmatplotlibboxplot

解决方案


您可以根据这个有用的答案在 matplotlib 中使用Axes.bxp 方法。输入是包含相关值的字典列表,但中位数是这些字典中的必需键。由于您提供的数据不包括中位数,我在下面的代码中制作了中位数(但您需要根据您的实际数据计算它们)。

import matplotlib.pyplot as plt
import pandas as pd

# reproducing your data
df = pd.DataFrame({'A':[10,3,5,9],'B':[11,4,6,7],'C':[14,10,12,13]})

# add a row for median, you need median values! 
sample_medians = {'A':7, 'B':6.5, 'C':12.5}
df = df.append(sample_medians, ignore_index=True)
df.index = ['max','min','q1','q3','med']

这是包含中位数的修改后的df:

>>> df
        A     B     C
max  10.0  11.0  14.0
min   3.0   4.0  10.0
q1    5.0   6.0  12.0
q3    9.0   7.0  13.0
med   7.0   6.5  12.5

现在我们将 df 转换为字典列表:

labels = list(df.columns)

# create dictionaries for each column as items of a list
bxp_stats = df.apply(lambda x: {'med':x.med, 'q1':x.q1, 'q3':x.q3, 'whislo':x['min'], 'whishi':x['max']}, axis=0).tolist()

# add the column names as labels to each dictionary entry
for index, item in enumerate(bxp_stats):
    item.update({'label':labels[index]})

_, ax = plt.subplots()
ax.bxp(bxp_stats, showfliers=False);
plt.show()

在此处输入图像描述

不幸的是,中线是必需的参数,因此必须为每个框指定。因此,我们只是让它尽可能薄,几乎看不见。

如果您希望使用不同的规格绘制每个框,则它们必须位于不同的子图中。我知道这看起来有点难看,所以你可以玩弄子图之间的间距或考虑删除一些 y 轴。

fig, axes = plt.subplots(nrows=1, ncols=3, sharey=True)

# specify list of background colors, median line colors same as background with as thin of a width as possible
colors = ['LightCoral', '#FEF1B5', '#EEAEEE']
medianprops = [dict(linewidth = 0.1, color='LightCoral'), dict(linewidth = 0.1, color='#FEF1B5'), dict(linewidth = 0.1, color='#EEAEEE')]
# create a list of boxplots of length 3
bplots = [axes[i].bxp([bxp_stats[i]], medianprops=medianprops[i], patch_artist=True, showfliers=False) for i in range(len(df.columns))]
# set each boxplot a different color
for i, bplot in enumerate(bplots):
    for patch in bplot['boxes']:
        patch.set_facecolor(colors[i])
plt.show()

在此处输入图像描述


推荐阅读