是否有将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'值'(但这些只是标签)。
答案 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))
答案 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')
更新:看来,我错了,正如用户mwaskom指出的那样,您可以通过巧妙地使用order
关键字来指定排名,但似乎您需要将您的数据从“宽”格式重塑为“长”格式。