沿 x 轴所需距离处的 seaborn 箱线图

Posted

技术标签:

【中文标题】沿 x 轴所需距离处的 seaborn 箱线图【英文标题】:seaborn boxplots at desired distances along the x axis 【发布时间】:2016-05-07 12:52:55 【问题描述】:

是否可以将seaborn 箱线图放置在沿 x 轴所需距离处?

我有一个数据框 具有索引分配、最大值、类型的分层列索引 学生姓名的行索引

+------------+----------+---------+----------+---------------+
| Type       | Homework | Quiz    | Homework | Presentations |
|            | max 100  | max 100 | max 100  | max 100       |
+------------+----------+---------+----------+---------------+
| Assignment | 1        | 2       | 3        | 4             |
+------------+----------+---------+----------+---------------+
| Student 1  | 88       | 98      | 100      | 85            |
+------------+----------+---------+----------+---------------+
| Student 2  | 96       | 79      | 100      | 97            |
+------------+----------+---------+----------+---------------+
| Student 3  | 87       | 79      | 72       | 78            |
+------------+----------+---------+----------+---------------+
| Student 4  | 87       | 84      | 90       | 85            |
+------------+----------+---------+----------+---------------+
| Student 5  | 73       | 91      | 76       | 90            |
+------------+----------+---------+----------+---------------+
| Student 6  | 70       | 75      | 98       | 82            |
+------------+----------+---------+----------+---------------+
| Student 7  | 85       | 71      | 73       | 75            |
+------------+----------+---------+----------+---------------+
| Student 8  | 76       | 81      | 94       | 86            |
+------------+----------+---------+----------+---------------+
| Student 9  | 97       | 80      | 95       | 88            |
+------------+----------+---------+----------+---------------+

实际上,Assignments 是字符串并且更具描述性。

我可以轻松地将数据框输入 seaborn,它会生成一个漂亮的箱线图 sns.boxplot(df)

我真正想要的是将框分隔到不同的子图上(不难),但要按时间顺序适当间隔。

更清楚:

目前sns.boxplot(df) 按时间顺序放置所有箱形图,这很好。 例如,我想要一个子图,它只有测验箱形图,但测验箱形图在 x 轴上水平排列,如果包括所有作业,它们会落在哪里。

是否有沿 x 轴在所需距离处放置 seaborn 箱线图

sns.boxplot(df['Quiz'], x=[1,5,9,12]) 不起作用,因为您无法覆盖 x“值”(但这些只是标签)。

【问题讨论】:

【参考方案1】:

更新:看来,我错了,正如mwaskom 指出的那样,您可以通过巧妙地使用order 关键字来指定位置,但似乎您需要从'重塑您的数据宽'到'长'格式。


简短的回答是seaborn.boxplot 没有选项来指定箱线图沿 x 轴的位置。

如果您不太关心样式或可以手动指定样式,则可以使用 pandas.DataFrame.boxplot 代替,它具有 positions 属性。

import matplotlib.pyplot as plt
import pandas as pd
import numpy.random as rnd   # just to generate some data

data = pd.DataFrame(rnd.randn(10,4))
data.boxplot(positions=[1,5,6,10])
plt.grid('off')

【讨论】:

【参考方案2】:
import numpy as np
import pandas as pd
import seaborn as sns
df = pd.DataFrame(dict(x=np.repeat([0, 3, 5, 6], 10),
                       y=np.random.randn(40)))
sns.boxplot(x="x", y="y", data=df, order=np.arange(7))

【讨论】:

这对于整数位置很酷,但对于浮点位置不实用。有什么建议可以实现吗?

以上是关于沿 x 轴所需距离处的 seaborn 箱线图的主要内容,如果未能解决你的问题,请参考以下文章

Python Matplotlib 箱线图颜色

使用 seaborn 的单个箱线图中的多列

同一图上 Pandas 数据框多列的箱线图(seaborn)

Seaborn:需要解决箱线图中图形边距的方法[重复]

基于 DataFrame 列名的颜色 seaborn 箱线图

在seaborn中绘制多个箱线图?