我想用我的DataFrame绘制一个盒子图:
A B C
max 10 11 14
min 3 4 10
q1 5 6 12
q3 9 7 13
如何使用这些固定值绘制箱形图?
发布于 2020-06-01 07:22:49
您可以基于this helpful answer在matplotlib中使用Axes.bxp method。输入是包含相关值的字典列表,但中位数是这些字典中的必需键。由于您提供的数据不包括中位数,因此我在下面的代码中虚构了中位数(但您需要根据实际数据计算它们)。
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()
https://stackoverflow.com/questions/62125848
复制