import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
df = pd.read_csv('E:/python/Python数据分析与挖掘从零开始到实战/数据分析篇/学习笔记/数据/air_data.csv')
df.head()
| MEMBER_NO | FFP_DATE | FIRST_FLIGHT_DATE | GENDER | FFP_TIER | WORK_CITY | WORK_PROVINCE | WORK_COUNTRY | AGE | LOAD_TIME | ... | ADD_Point_SUM | Eli_Add_Point_Sum | L1Y_ELi_Add_Points | Points_Sum | L1Y_Points_Sum | Ration_L1Y_Flight_Count | Ration_P1Y_Flight_Count | Ration_P1Y_BPS | Ration_L1Y_BPS | Point_NotFlight | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 54993 | 2006/11/2 | 2008/12/24 | 男 | 6 | . | 北京 | CN | 31.0 | 2014/3/31 | ... | 39992 | 114452 | 111100 | 619760 | 370211 | 0.509524 | 0.490476 | 0.487221 | 0.512777 | 50 |
| 1 | 28065 | 2007/2/19 | 2007/8/3 | 男 | 6 | NaN | 北京 | CN | 42.0 | 2014/3/31 | ... | 12000 | 53288 | 53288 | 415768 | 238410 | 0.514286 | 0.485714 | 0.489289 | 0.510708 | 33 |
| 2 | 55106 | 2007/2/1 | 2007/8/30 | 男 | 6 | . | 北京 | CN | 40.0 | 2014/3/31 | ... | 15491 | 55202 | 51711 | 406361 | 233798 | 0.518519 | 0.481481 | 0.481467 | 0.518530 | 26 |
| 3 | 21189 | 2008/8/22 | 2008/8/23 | 男 | 5 | Los Angeles | CA | US | 64.0 | 2014/3/31 | ... | 0 | 34890 | 34890 | 372204 | 186100 | 0.434783 | 0.565217 | 0.551722 | 0.448275 | 12 |
| 4 | 39546 | 2009/4/10 | 2009/4/15 | 男 | 6 | 贵阳 | 贵州 | CN | 48.0 | 2014/3/31 | ... | 22704 | 64969 | 64969 | 338813 | 210365 | 0.532895 | 0.467105 | 0.469054 | 0.530943 | 39 |
5 rows × 44 columns
df1 = df['FFP_TIER'].value_counts()
df1
4 58066 5 3409 6 1513 Name: FFP_TIER, dtype: int64
# 解决中⽂显示问题 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False一、基础绘图
plt.style.use('default')
# 解决中⽂显示问题
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(20,8),dpi=80)
plt.bar(df1.index,height=df1.values,color='skyblue')
plt.xticks([4,5,6],['等级四','等级五','等级六'])
plt.ylabel('用户数量',fontsize=12,labelpad=10)
plt.title('未使用seaborn',fontsize=14,pad=10)
plt.show()
二、使用seaborn绘图
1、seaborn绘图(一)
plt.style.use('seaborn')
# 解决中⽂显示问题
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(20,8),dpi=80)
plt.bar(df1.index,df1.values,color='skyblue')
plt.xticks([4,5,6],['等级四','等级五','等级六'])
plt.ylabel('用户数量',fontsize=12,labelpad=10)
plt.title('seaborn绘图(1)',fontsize=14,pad=10)
plt.show()
plt.style.use('default')
2、seaborn绘图(二)
sns.set()
# 解决中⽂显示问题
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(20,8),dpi=80)
plt.bar(df1.index,df1.values,color='skyblue')
plt.xticks([4,5,6],['等级四','等级五','等级六'])
plt.ylabel('用户数量',fontsize=12,labelpad=10)
plt.title('seaborn绘图(2)',fontsize=14,pad=10)
plt.show()
3、seaborn绘图(3)
data = pd.Dataframe(df1)
data = data.reset_index()
data
| index | FFP_TIER | |
|---|---|---|
| 0 | 4 | 58066 |
| 1 | 5 | 3409 |
| 2 | 6 | 1513 |
data.columns = ['会员卡等级','会员数量'] data
| 会员卡等级 | 会员数量 | |
|---|---|---|
| 0 | 4 | 58066 |
| 1 | 5 | 3409 |
| 2 | 6 | 1513 |
# 解决中⽂显示问题
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(20,8),dpi=80)
sns.barplot(x='会员卡等级',y='会员数量',data=data,color='skyblue')
plt.ylabel('用户数量',fontsize=12,labelpad=10)
plt.title('seaborn绘图(3)',fontsize=14,pad=10)
plt.show()
三、绘制常用统计图形
1、柱状图
sns.barplot(x,y,hue,data,color,palette,orient)
- x,y 不同坐标上的值
- hue: 分类变量
- data: 数据
- color: 颜色
- palette: 调色板
- orient: 方向(vertical: 垂直, horizontal: 水平)
一般调色板参数,请见
http://seaborn.pydata.org/generated/seaborn.color_palette.html#seaborn.color_palette
常用的如muted,RdBu,Set1,Blues_d ,husl等几个选项
df_bar = df.groupby(['FFP_TIER','GENDER'])['MEMBER_NO'].count()
df_barplot = df_bar.reset_index()
df_barplot.columns=['会员卡等级','性别','会员数量']
df_barplot
| 会员卡等级 | 性别 | 会员数量 | |
|---|---|---|---|
| 0 | 4 | 女 | 14208 |
| 1 | 4 | 男 | 43856 |
| 2 | 5 | 女 | 486 |
| 3 | 5 | 男 | 2923 |
| 4 | 6 | 女 | 157 |
| 5 | 6 | 男 | 1355 |
plt.figure(figsize=(20,8),dpi=80)
sns.barplot(x='会员卡等级',y='会员数量',data=df_barplot,color='skyblue',hue='性别',palette='muted',orient='v')
plt.title('seaborn绘图--柱状图',fontsize=14,pad=10)
plt.xticks(range(3),['等级四','等级五','等级六'])
plt.legend(loc='best')
plt.show()
2、散点图
sns.scatterplot(x,y,hue,data,color,palette,style,s,markers)
- x,y不同坐标上的值
- hue: 分类变量
- data: 数据
- color: 颜色
- palette: 调色板
- style: 以分类变量作图,产生不同的形状
- s: 形状大小
- markers: 形状
# 飞行次数和飞行里程的关系 df_scatter = df[['FLIGHT_COUNT','SEG_KM_SUM']]
df_scatter.head()
| FLIGHT_COUNT | SEG_KM_SUM | |
|---|---|---|
| 0 | 210 | 580717 |
| 1 | 140 | 293678 |
| 2 | 135 | 283712 |
| 3 | 23 | 281336 |
| 4 | 152 | 309928 |
plt.figure(figsize=(20,8),dpi=80)
sns.scatterplot(x='FLIGHT_COUNT',y='SEG_KM_SUM',data=df_scatter,palette='husl',s=50,markers='O')
plt.xlabel('飞行次数',fontsize=12,labelpad=10)
plt.ylabel('飞行里程',fontsize=12,labelpad=10)
plt.title('飞行次数和飞行里程的关系',fontsize=14,pad=10)
plt.show()
# 不同性别飞行次数和飞行里程的关系
plt.figure(figsize=(20,8),dpi=80)
sns.scatterplot(x='FLIGHT_COUNT',y='SEG_KM_SUM',hue='GENDER',data=df,palette='husl',s=50,style='GENDER'
#,markers='O',
)
plt.xlabel('飞行次数',fontsize=12,labelpad=10)
plt.ylabel('飞行里程',fontsize=12,labelpad=10)
plt.title('不同性别飞行次数和飞行里程的关系',fontsize=14,pad=10)
plt.show()
3、箱线图
sns.boxplot(x,y,hue,data,order, width, fliersize,linewidth, color,palette)
- x,y不同坐标上的值
- hue: 分类变量
- data: 数据
- width: 箱线宽度
- fliersize: 异常值点的大小
- color: 颜色
- palette: 调色板
- linewidth: 指定箱体边框的宽度
plt.figure(figsize=(20,8),dpi=80)
sns.boxplot(y = 'AGE', data = df,
showmeans=True,color = 'skyblue',width =0.3, linewidth=2,
flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':10},
meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':8},
medianprops = {'linestyle':'--','color':'red'})
plt.xlabel('')
plt.ylabel('年龄')
plt.title('年龄箱线图')
plt.show()
plt.figure(figsize=(20,8),dpi=80)
sns.boxplot(x='GENDER',y = 'AGE', data = df,
showmeans=True,color = 'skyblue',width =0.3, linewidth=2,
flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':10},
meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':8},
medianprops = {'linestyle':'--','color':'red'})
plt.xlabel('')
plt.ylabel('年龄')
plt.title('不同性别年龄箱线图')
plt.show()
4、直方图
sns.distplot(a,bins,hist,kde,rug, fit, hist_kws,kde_kws, fit_kws, color,norm_hist,ax)
-
a: 数据
-
bins: 直方条形个数
-
hist: 是否绘制直方图
-
kde: 是否绘制核密度图
-
fit: 是否绘制概率密度曲线图
-
hist_kws: 传递直方图相关参数
-
kde_kes: 传递核密度图相关参数
-
fit_kws: 传递概率密度曲线相关参数
-
color: 曲线颜色
-
norm_hist: 是否将频数改成频率
-
ax: 指定子图位置
-
绘制直方图
# 男性、女性年龄分布 man_age = df.AGE[df.GENDER=='男'] woman_age = df.AGE[df.GENDER=='女']
plt.figure(figsize=(20,8),dpi=80)
sns.distplot(man_age,bins=30,hist=True,norm_hist=True, label = '男性年龄分布图',color='skyblue')
plt.xlabel('年龄')
plt.ylabel('')
plt.title('男性-年龄分布图')
plt.show()
plt.figure(figsize=(20,8),dpi=80)
sns.distplot(woman_age,bins=30,hist=True,norm_hist=True, label = '女性年龄分布图',color='hotpink')
plt.xlabel('年龄')
plt.ylabel('')
plt.title('女性-年龄分布图')
plt.show()
- 绘制核密度分布图
plt.figure(figsize=(20,8),dpi=80)
sns.distplot(man_age, hist=False, kde = True, kde_kws = {'color':'skyblue'}, norm_hist=True, label = '男性年龄分布图')
sns.distplot(woman_age, hist=False, kde = True, kde_kws = {'color':'hotpink'}, norm_hist=True, label = '女性年龄分布图')
plt.title('年龄分布图')
plt.legend()
plt.show()
5、折线图
# 按照年份汇总数据,计算总飞行次数和飞行里程数
df['YEAR'] = df['FFP_DATE'].str.split('/',expand=True)[0]
df_line = df.groupby(df['YEAR'])[['FLIGHT_COUNT', 'SEG_KM_SUM']].sum()
df_line.reset_index()
| YEAR | FLIGHT_COUNT | SEG_KM_SUM | |
|---|---|---|---|
| 0 | 2004 | 8492 | 13046594 |
| 1 | 2005 | 54584 | 76263647 |
| 2 | 2006 | 74116 | 107466218 |
| 3 | 2007 | 81398 | 115824690 |
| 4 | 2008 | 80384 | 115958959 |
| 5 | 2009 | 73515 | 102908088 |
| 6 | 2010 | 92398 | 133804987 |
| 7 | 2011 | 117870 | 170898377 |
| 8 | 2012 | 135812 | 200675940 |
| 9 | 2013 | 27172 | 41751371 |
plt.figure(figsize=(20,8),dpi=80)
sns.lineplot(x="YEAR", y="FLIGHT_COUNT",data =df_line,lw=2,color="red")
# sns.lineplot(x="YEAR", y="SEG_KM_SUM",data =df_line,lw=2,color="blue")
plt.ylabel('飞行次数')
plt.xlabel('年份')
plt.title('飞行次数变化趋势')
plt.show()
6、回归图
plt.figure(figsize=(20,8),dpi=80)
sns.lmplot(x="FLIGHT_COUNT", y="SEG_KM_SUM",data =df_line,legend_out=False,
markers='o',fit_reg= True,aspect=1.3,height=8,
scatter_kws={'s':50,'facecolor':'red'})
plt.xlabel('飞行次数')
plt.ylabel('飞行公里数')
plt.title('飞行次数和飞行公里数的关系')
plt.show()
7、countplot
countplot()主要用于绘制数据中,每个类别出现的数量,只能计数
# 绘制不同区域订单数量
plt.figure(figsize=(20,8),dpi=80)
sns.countplot(x ='FFP_TIER',data = df)
plt.ylabel('用户数量')
plt.xlabel('会员卡级别')
plt.title('不同会员卡级别下的用户数量')
plt.show()
# 绘制不同区域订单数量
plt.figure(figsize=(20,8),dpi=80)
sns.countplot(x ='FFP_TIER',data = df,hue ='GENDER')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.ylabel('用户数量')
plt.xlabel('会员卡级别')
plt.title('不同会员卡级别下的男女用户数量')
plt.show()
四、seaborn绘图风格设置
sns.set (context, style, palette, font, font_scale, color_codes)
- style: 为绘图风格,一共五种风格(darkgrid(灰白背景+网格) whitegrid(白白背景+灰网格) dark white ticks带坐标轴刻度)
- context: 控制绘图元素的规模,paper,notebook, talk, and poster (元素缩放)
- Palette: 调色板,deep, muted, pastel, bright, dark, colorblind
- Font: 这个参数一般不管,不用调整
- font_scale: 字体大小
- color_codes: 一般用默认值
# 以订单数据为例
plt.figure(figsize=(20,8),dpi=80)
sns.set(style='darkgrid',context='notebook',font_scale=1.0,palette='colorblind')
# 支持中文显示
sns.countplot(x ='FFP_TIER',data = df,hue ='GENDER')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.ylabel('用户数量')
plt.xlabel('会员卡级别')
plt.title('不同会员卡级别下的男女用户数量')
plt.show()



