在pandas数据帧上叠加箱线图上的实际数据

时间:2014-04-12 21:25:55

标签: matplotlib pandas dataframe boxplot seaborn

我正在使用Seaborn从pandas数据帧制作箱图。 Seaborn boxplots似乎基本上以与pandas boxplot功能相同的方式读取数据帧(所以我希望两者的解决方案相同 - 但我可以使用{{1功能也是如此)。我的数据框有12列,下面的代码生成一个单独的图,每个列有一个boxplot(就像dataframe.boxplot函数一样)。

dataframe.boxplot()

有人可以建议一种简单的方法来覆盖所有值(按列),同时从数据框中制作一个箱线图吗? 我将不胜感激任何帮助。

3 个答案:

答案 0 :(得分:6)

此问题尚未添加到seaborn.boxplot函数中,但seaborn.violinplot函数中有类似内容other advantages

x = np.random.randn(30, 6)
sns.violinplot(x, inner="points")
sns.despine(trim=True)

enter image description here

答案 1 :(得分:2)

整个数据框的boxplot的一般解决方案,它应该适用于seabornpandas,因为它们都是基于引擎盖的matplotlib,我将使用{{1以情节为例,假设pandas已经到位。由于您已经拥有import matplotlib.pyplot as plt,因此仅使用ax代替ax.text(...)会更有意义。

plt.text(...)

enter image description here

对于数据框中的单个系列,需要进行一些小的更改:

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

enter image description here

制作散点图也是类似的:

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

enter image description here enter image description here

要覆盖#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()

Box plot overlay