整个数据框的箱线图的通用解决方案,它应该适用于两者seaborn
,并且pandas
它们都matplotlib
基于引擎盖,我将使用pandas
plot 作为示例,假设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
。他们似乎在1,2,3,4,....
. 因此,对于第一列中的值,我们希望它们绘制在 x=1;x=2 处的第二列,依此类推。
任何有效的方法都是使用np.repeat
, repeat 1,2,3,4...
, each for n
times, wheren
是观察次数。然后我们可以用这些数字作为x
坐标来绘制一个图。由于它是一维的,对于y
坐标,我们需要一个扁平化的数据视图,由df.ravel()
为了覆盖文本字符串,我们需要另一个步骤(循环)。因为我们一次只能绘制一个 x 值、一个 y 值和一个文本字符串。