python - Matplotlib DataFrame 箱线图,具有给定的最大值、最小值和四分位数
问题描述
我想用我的 DataFrame 绘制一个箱线图:
A B C
max 10 11 14
min 3 4 10
q1 5 6 12
q3 9 7 13
如何绘制具有这些固定值的箱线图?
解决方案
您可以根据这个有用的答案在 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()
推荐阅读
- rust - 什么是 decl_storage 中的“storage_name”示例
- javascript - 错误:StatusCodeError:413 - {"error":{"code":413,"message":"request entity too large"}}
- postfix-mta - 修改依赖消息内容中的主题
- typescript - 创建到其他点的路线时如何更改缩放比例?
- java - 编写一个方法 containsInstanceOf(Class )
- reactjs - 如何将类型设置为 ref 对象,该对象可以分配给具有相同根类的所有继承类
- javascript - Memoize 接受 Symbol('foo') 作为参数
- ios - 我可以将 UIActivityViewController 添加到我的 ViewController 吗?
- bash - 部分文件名作为 Shell 脚本输入
- flutter - 如何使用颤振中的路线导航到主页面以外的页面?