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

时间:2016-01-29 17:24:44

标签: python pandas seaborn

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

我有一个数据框     带索引的分层列索引Assignment,Max,Type     学生姓名的行索引

+------------+----------+---------+----------+---------------+
| 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            |
+------------+----------+---------+----------+---------------+

实际上,分配是字符串,更具描述性。

我可以轻松地将数据帧输入seaborn,它将产生一个漂亮的盒子图 sns.boxplot(DF)

我真正喜欢的是将盒子分成不同的子图(不是很难),而是按时间顺序间隔开来。

更清楚:

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

无论如何将沿着x轴的所需距离放置海啸箱图

sns.boxplot(df['Quiz'], x=[1,5,9,12])不能正常工作,因为你无法覆盖x'值'(但这些只是标签)。

2 个答案:

答案 0 :(得分:9)

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))

enter image description here

答案 1 :(得分:3)

简短回答是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')

boxplot with positions

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