Seaborn可视化
学习目标
- 掌握seaborn的可视化绘图方法
1 Seaborn简介
- Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
- Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。
- Seaborn和Pandas的API配合的很好,使用DataFrame/Series的数据就可以绘图
import pandas as pd
import matplotlib.pyplot as plt
# %matplotlib inline
import seaborn as sns
#加载数据 index_col 指定索引列, parse_dates=True 解析日期数据为datetime类型
fifa_data = pd.read_csv('data/fifa.csv', index_col='Date', parse_dates=True)
fifa_data.head()
显示结果
Date ARG BRA ESP FRA GER ITA 1993-08-08 5.0 8.0 13.0 12.0 1.0 2.0 1993-09-23 12.0 1.0 14.0 7.0 5.0 2.0 1993-10-22 9.0 1.0 7.0 14.0 4.0 3.0 1993-11-19 9.0 4.0 7.0 15.0 3.0 1.0 1993-12-23 8.0 3.0 5.0 15.0 1.0 2.0
- pandas绘图
fifa_data.plot.line(figsize=(16,8))
- seaborn 绘图
import seaborn as sns
plt.figure(figsize=(16,6))
sns.lineplot(data=fifa_data)
2 Seaborn绘制单变量图
2.1 直方图
- 使用sns.distplot创建直方图,如下所示:
import seaborn as sns
#加载seaborn的自带数据
tips = sns.load_dataset('tips', data_home='data/seaborn-data')
#使用subplots函数创建画布,并在其中添加子图
hist,ax = plt.subplots()
# 使用seaborn的displot函数绘图
ax = sns.distplot(tips['total_bill'])
ax.set_title('Total Bill Histogram with Density Plot')
-
seaborn.displot
默认会同时绘制直方图和密度图(核密度估计 kde)。如果只想绘制直方图,可以把kde参数设置为False核密度估计,就是采用平滑的峰值函数(“核”)来拟合观察到的数据点,从而对真实的概率分布曲线进行模拟。
hist,ax=plt.subplots()
# 使用seaborn的displot函数绘图
ax = sns.distplot(tips['total_bill'], kde=False)
ax.set_title('Total Bill Histogram')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Frequency')
2.2 密度图(核密度估计)
- 密度图是展示单变量分布的另一种方法,本质上是通过绘制每个数据点为中心的正态分布,然后消除重叠的图,使曲线下的面积为1来
hist,ax=plt.subplots()
# 使用seaborn的displot函数绘图
ax = sns.distplot(tips['total_bill'], hist=False)
ax.set_title('Total Bill Histogram')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Frequency')
- 如果只绘制密度图,还可以使用sns.kdeplot函数
hist,ax = plt.subplots()
ax = sns.kdeplot(tips['total_bill'])
ax.set_title('Total Bill Histogram')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Frequency')
2.3 频数图
- 频数图是变量分布的一维表示,常与其他图一起使用,以增强可视化效果。
- 下图展示的是带密度图和频数图的直方图
hist,ax = plt.subplots()
# 使用seaborn的displot函数绘图
ax = sns.distplot(tips['total_bill'], rug=True)
ax.set_title('Total Bill Histogram with Density and Rug Plot')
ax.set_xlabel('Total Bill')
2.4 计数图(条形图)
- 计数图和直方图很像,直方图通过对数据分组来描述分布,计数图(条形图)是对离散变量(分类变量)计数。
count,ax = plt.subplots()
ax = sns.countplot('day', data=tips)
ax.set_title('Count of days')
ax.set_xlabel('Day of the Week')
ax.set_ylabel('Frequency')
3 Seaborn 双变量数据可视化
3.1 散点图
- 在seaborn中,创建散点图的方法有很多,但是并没有名为scatter的函数。
- 创建散点图可以使用regplot函数。regplot不仅可以绘制散点图,还会拟合回归线,把fit_reg设置为False,将只显示散点图
figure, ax = plt.subplots()
ax = sns.regplot(x='total_bill', y='tip', data=tips)
ax.set_title('Scatterplot of Total Bill and Tip')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')
- lmplot函数和regplot函数类似,也可以用于创建散点图。lmplot函数内部会调用regplot,两者的主要区别是regplot创建坐标轴,而lmplot创建图
fig = sns.lmplot(x='total_bill', y='tip', data=tips)
- 还可以使用jointplot在每个轴上创建包含单个变量直方图的散点图。
joint = sns.jointplot(x='total_bill', y='tip', data=tips)
joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
# 添加标题,设置字号;y=1.03表示移动轴域上方的文字
joint.fig.suptitle('Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)
3.2 蜂巢图
- 使用Seaborn的jointplot绘制蜂巢图,和使用matplotlib的hexbin函数进行绘制的效果类似
joint = sns.jointplot(x='total_bill', y='tip', data=tips, kind='hex')
joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
joint.fig.suptitle('Hexbin Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)
3.3 2D密度图
- 2D核密度图和distplot类似,但2D核密度图可展示两个变量
kde,ax = plt.subplots()
ax = sns.kdeplot(data=tips['total_bill'], data2=tips['tip'], shade=True) #是否填充轮廓
ax.set_title('Kernel Density Plot of Total Bill and Tip')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')
- 如果参数shade为False,默认为False
kde,ax = plt.subplots()
ax = sns.kdeplot(data=tips['total_bill'],data2=tips['tip'],shade=False) #是否填充轮廓
ax.set_title('Kernel Density Plot of Total Bill and Tip')
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')
- 在轴上添加添加kde
kde_joint = sns.jointplot(x ='total_bill', y='tip', data=tips, shade=True, kind='kde')
3.4 条形图
- 条形图也可以用于展现多个变量,barplot默认会计算平均值
import numpy as np
bar,ax = plt.subplots()
ax = sns.barplot(x='time', y='total_bill', data=tips)
ax.set_title('Bar plot of average total bill for time of day')
ax.set_xlabel('Time of day')
ax.set_ylabel('Average total bill')