Seaborn是一种基于matplotlib的图形可视化python libraty。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。 Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。掌握seaborn能很大程度帮助我们更高效的观察数据与图表,并且更加深入了解它们。 实验数据可以从这里[下载](https://github.com/jakevdp/marathon-data)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
%matplotlib inline
warnings.filterwarnings('ignore')
默认情况下,Pandas会把时间列加载为Python字符串格式(类型是object),写一个把字符串转换成时间类型的函数
def convert_time(s):
h,m,s=map(int,s.split(':'))
return pd.datetools.timedelta(hours=h,minutes=m,seconds=s)
data=pd.read_csv('marathon-data.csv',converters={
'split':convert_time,'final':convert_time})
data.head()
age | gender | split | final | |
---|---|---|---|---|
0 | 33 | M | 01:05:38 | 02:08:51 |
1 | 32 | M | 01:06:26 | 02:09:28 |
2 | 31 | M | 01:06:49 | 02:10:42 |
3 | 38 | M | 01:06:16 | 02:13:45 |
4 | 31 | M | 01:06:32 | 02:13:59 |
data.dtypes
age int64
gender object
split timedelta64[ns]
final timedelta64[ns]
dtype: object
添加一列,将时间换算成秒:
data['split_sec']=data['split'].map(lambda x:x.seconds)
data['final_sec']=data['final'].map(lambda x:x.seconds)
data.head()
age | gender | split | final | split_sec | final_sec | |
---|---|---|---|---|---|---|
0 | 33 | M | 01:05:38 | 02:08:51 | 3938 | 7731 |
1 | 32 | M | 01:06:26 | 02:09:28 | 3986 | 7768 |
2 | 31 | M | 01:06:49 | 02:10:42 | 4009 | 7842 |
3 | 38 | M | 01:06:16 | 02:13:45 | 3976 | 8025 |
4 | 31 | M | 01:06:32 | 02:13:59 | 3992 | 8039 |
用sns.jointplot可以同时看到两个变量的联合分布与单变量的独立分布,这个图形中使用白色背景。
with sns.axes_style('white'):
g=sns.jointplot('split_sec','final_sec',data,kind='kde')
g.ax_joint.plot(np.linspace(4000,16000),np.linspace(8000,32000),':k')
可以使用六边形块代替频次直方图
with sns.axes_style('white'):
g=sns.jointplot('split_sec','final_sec',data,kind='hex',color='r')
g.ax_joint.plot(np.linspace(4000,16000),np.linspace(8000,32000),':b')
上图表示的是马拉松前半程成绩与全程成绩的对比。图中的实点线表示一个人全程保持一个速度跑完马拉松,即上半程与下半程耗时相同。然而实际的成绩分布表明,绝大多数人都是越往后跑得越慢(也符合常理)。如果你参加过跑步比赛,那么就一定知道有些人在比赛的后半程速度更快—也就是在比赛中“后半程加速”。
创建一列split_frac来表示前后半程的差异,衡量比赛选手后半程加速或前半程加速的程度。
data["split_frac"]=1-2*data['split_sec']/data['final_sec']
data.head()
age | gender | split | final | split_sec | final_sec | split_frac | |
---|---|---|---|---|---|---|---|
0 | 33 | M | 01:05:38 | 02:08:51 | 3938 | 7731 | -0.018756 |
1 | 32 | M | 01:06:26 | 02:09:28 | 3986 | 7768 | -0.026262 |
2 | 31 | M | 01:06:49 | 02:10:42 | 4009 | 7842 | -0.022443 |
3 | 38 | M | 01:06:16 | 02:13:45 | 3976 | 8025 | 0.009097 |
4 | 31 | M | 01:06:32 | 02:13:59 | 3992 | 8039 | 0.006842 |
如果前后半程差异系数( split_frac)小于0,就表示这个人是后半程加速型选手。画出差异系数的分布图。
sns.distplot(data['split_frac'],kde=False,color='g')
plt.axvline(0, color="r",linestyle="--")#画垂直x轴的线
上图表示前后半程差异系数分布图,0表示前后半程耗时相同。
sum(data['