我正在使用Seaborn从pandas数据帧制作箱图。 Seaborn
boxplots似乎基本上以与pandas
boxplot
功能相同的方式读取数据帧(所以我希望两者的解决方案相同 - 但我可以使用{{1功能也是如此)。我的数据框有12列,下面的代码生成一个单独的图,每个列有一个boxplot(就像dataframe.boxplot
函数一样)。
dataframe.boxplot()
有人可以建议一种简单的方法来覆盖所有值(按列),同时从数据框中制作一个箱线图吗? 我将不胜感激任何帮助。
答案 0 :(得分:6)
此问题尚未添加到seaborn.boxplot
函数中,但seaborn.violinplot
函数中有类似内容other advantages:
x = np.random.randn(30, 6)
sns.violinplot(x, inner="points")
sns.despine(trim=True)
答案 1 :(得分:2)
整个数据框的boxplot的一般解决方案,它应该适用于seaborn
和pandas
,因为它们都是基于引擎盖的matplotlib
,我将使用{{1以情节为例,假设pandas
已经到位。由于您已经拥有import matplotlib.pyplot as plt
,因此仅使用ax
代替ax.text(...)
会更有意义。
plt.text(...)
对于数据框中的单个系列,需要进行一些小的更改:
In [35]:
print df
V1 V2 V3 V4 V5
0 0.895739 0.850580 0.307908 0.917853 0.047017
1 0.931968 0.284934 0.335696 0.153758 0.898149
2 0.405657 0.472525 0.958116 0.859716 0.067340
3 0.843003 0.224331 0.301219 0.000170 0.229840
4 0.634489 0.905062 0.857495 0.246697 0.983037
5 0.573692 0.951600 0.023633 0.292816 0.243963
[6 rows x 5 columns]
In [34]:
df.boxplot()
for x, y, s in zip(np.repeat(np.arange(df.shape[1])+1, df.shape[0]),
df.values.ravel(), df.values.astype('|S5').ravel()):
plt.text(x,y,s,ha='center',va='center')
制作散点图也是类似的:
In [35]:
sub_df=df.V1
pd.DataFrame(sub_df).boxplot()
for x, y, s in zip(np.repeat(1, df.shape[0]),
sub_df.ravel(), sub_df.values.astype('|S5').ravel()):
plt.text(x,y,s,ha='center',va='center')
要覆盖#for the whole thing
df.boxplot()
plt.scatter(np.repeat(np.arange(df.shape[1])+1, df.shape[0]), df.values.ravel(), marker='+', alpha=0.5)
#for just one column
sub_df=df.V1
pd.DataFrame(sub_df).boxplot()
plt.scatter(np.repeat(1, df.shape[0]), sub_df.ravel(), marker='+', alpha=0.5)
上的内容,我们需要首先猜测boxplot
中每个方框的绘制位置。他们似乎在xaxis
。因此,对于第一列中的值,我们希望它们在x = 1处绘制; x = 2处的第二列,依此类推。
任何有效的方法都是使用1,2,3,4,....
,重复np.repeat
,每次1,2,3,4...
次,其中n
是观察次数。然后我们可以使用这些数字作为n
坐标来绘制图表。由于它是一维的,对于x
坐标,我们需要一个展平的数据视图,由y
提供
为了覆盖文本字符串,我们需要一个花药步骤(循环)。因为我们一次只能绘制一个x值,一个y值和一个文本字符串。
答案 2 :(得分:0)
我有以下技巧:
data = np.random.randn(6,5)
df = pd.DataFrame(data,columns = list('ABCDE'))
Now assign a dummy column to df:
df['Group'] = 'A'
print df
A B C D E Group
0 0.590600 0.226287 1.552091 -1.722084 0.459262 A
1 0.369391 -0.037151 0.136172 -0.772484 1.143328 A
2 1.147314 -0.883715 -0.444182 -1.294227 1.503786 A
3 -0.721351 0.358747 0.323395 0.165267 -1.412939 A
4 -1.757362 -0.271141 0.881554 1.229962 2.526487 A
5 -0.006882 1.503691 0.587047 0.142334 0.516781 A
使用df.groupby.boxplot()
,即可完成。
df.groupby('Group').boxplot()