针对整个数据框的箱线图,应适用于seaborn
和pandas
,因为它们都基于matplotlib
,我将使用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')
制作散点图也类似:
df.boxplot()
plt.scatter(np.repeat(np.arange(df.shape[1])+1, df.shape[0]), df.values.ravel(), marker='+', alpha=0.5)
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
中的绘制位置。它们似乎是在 1,2,3,4,...
上显示的。因此,对于第一列中的值,我们希望它们在 x=1 位置绘制;第二列在 x=2 位置绘制,以此类推。
任何有效的方法都可以使用 np.repeat
来完成,重复 1,2,3,4...
,每个重复 n
次,其中 n
是观察次数。然后,我们可以绘制一个图形,使用这些数字作为x
坐标。由于它是一维的,所以对于 y
坐标,我们将需要数据的展平视图,由df.ravel()
提供。
对于叠加文本字符串,我们需要进行另一步操作(即循环)。因为我们只能一次绘制一个 x 值、一个 y 值和一个文本字符串。