Python数据分析系列(九):python可视化模块—利用Seaborn绘制图表

文章目录


前言

Seaborn是基于matplotlib的2D绘图库。它在统计绘图方面更加方便易用,并且有自己预定义的样式。Seaborn并非用于替代matplotlib,而是对于数据分析等工作更加方便。


一、Seaborn特点

Seaborn其实是在Matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用Seaborn就能做出很具有吸引力的图,Matplotlib试着让简单的事情更加简单,困难的事情变得可能,而Seaborn就是让困难的东西更加简单。

相比Matplotlib:

  • Seaborn绘图函数接口更加简洁,Matplotlib最大的困难是其默认的各种参数,而Seaborn则完全避免了这一问题。
  • 对Pandas数据更好友好,Matplotlib不依赖Scipy和Pandas,但是seaborn依赖Scipy和Pandas。
  • 预定义风格、样式好看。

二、Seaborn函数数据集、样式

自带数据集

seaborn本身提供一些数据库,用于seaborn学习使用。

  • sns.get_dataset_names():可以查看seaborn所支持的所有数据集。

  • sns.load_dataset(name):指定数据集名称可以加载数据。

    • name参数:从https://github.com/mwaskom/seaborn-data的{name}.csv加载数据集。

    • cache参数:如果为True,则尝试从缓存加载,如果未下载过,则下载后缓存,默认为True。

    • data_home参数:获取缓存目录,用sns.get_data_home()可以获取缓存目录。windows上默认为"C:\Users\user\seaborn-data"。

    • kargs:pandas.read_csv()函数支持的参数都可以用。

如下所示为加载“tips”数据集。加载出来的数据以pandas中DataFrame对象实例保存。

tips=sns.load_dataset("tips")
print(type(tips))  # <class 'pandas.core.frame.DataFrame'>

load_datase()t函数下载可能会报错:URLError: <urlopen error [Errno 11004] getaddrinfo failed>,可以用https://github.com/mwaskom/seaborn-data下载所有文件放到缓存目录就ok了。

在这里插入图片描述

数据集说明:

数据集名称 描述
flights 航空公司从1949年到1960年每个月乘坐人数。(有三列数据,分别是:年、月、乘客数量)
anagrams 来自一个心理学实验的数据,二十名测试者,分为注意力集中和不集中两类,每个人玩回文字字谜游戏,每个人记录三种游戏结果得分情况。
tips 餐厅小费数据,由日期,时间,总账单,小费,消费者性别,是否抽烟,以及用餐人数组成。
penguins 企鹅数据集,由物种,岛,鸟嘴长度,鸟嘴宽度,鳍足长度,体重,性别组成。
iris 鸢尾花卉数据集。由花萼长度,花萼宽度,花瓣长度,花瓣宽度,鸢尾花卉种类组成。
fmri 事件相关功能核磁共振成像数据。由测试者,时间点,事件,刺激类型,大脑区域,信号等组成。
anscombe 安斯库姆四重奏数据集。用于展现当数据序列差别非常大时一些统计值却相等的著名数据集。一共包含了4组数据,每组11个散点,四组数据均值、方差、相关系数及线性回归曲线(mean, variance, correlation, and linear regression lines)都相同,但具体分布差别巨大。
titanic 泰坦尼克号船员数据集,数据集描述的是船员的性别、年龄、所在船仓等级等特征及最后是否存活。
diamonds 钻石数据集。由钻石价格、克拉、切割质量、台面、钻石颜色、纯度、X:长度、Y:宽度、Z:深度、总深度百分比组成。
attention
brain_networks
car_crashes
dots
exercise
gammas
geyser
mpg mpg,miles per gallon即油耗,数据涉及城市周期燃料消耗(单位为每加仑英里),由油耗,气缸数量,排气量/排量,马力,重量,加速度,出厂时间,产地,车品牌组成。
planets
taxis

主题样式

Seaborn提供多种美观大方的外观主题。通过sns.set_theme()方法,可以对图像主题等等外观进行设置。

  • sns.set_theme()方法包含参数如下:
    • style:坐标轴、刻度样式,样式参数同axes_style()。
    • context:控制上下文参数,样式参数同plotting_context()。
    • palette:调色板,样式参数同color_palette()。
    • font:字体
    • rcdict:自定义参数对上述各参数的配置进行覆盖

style样式设置

样式参数控制背景颜色、示范启用网格等样式属性。

通过以下设置来应用样式:

  • set_theme(style):设置样式
  • sns.set_style(style=None,rc=None):设置样式
  • set.axes_style(style=None,rc=None):获取局部图表风格样式,或者作为上下文管理器,临时改变样式。

三个函数的样式参数同。

示例:

获取默认样式,返回一个样式字典。

import matplotlib.pyplot as plt
import seaborn as sns
sns.axes_style()
{
   'axes.facecolor': '#EAEAF2',
 'axes.edgecolor': 'white',
 'axes.grid': True,
 'axes.axisbelow': True,
 'axes.labelcolor': '.15',
 'figure.facecolor': 'white',
 'grid.color': 'white',
 'grid.linestyle': '-',
 'text.color': '.15',
 'xtick.color': '.15',
 'ytick.color': '.15',
 'xtick.direction': 'out',
 'ytick.direction': 'out',
 'lines.solid_capstyle': <CapStyle.round: 'round'>,
 'patch.edgecolor': 'w',
 'patch.force_edgecolor': True,
 'image.cmap': 'rocket',
 'font.family': ['sans-serif'],
 'font.sans-serif': ['Arial',
  'DejaVu Sans',
  'Liberation Sans',
  'Bitstream Vera Sans',
  'sans-serif'],
 'xtick.bottom': False,
 'xtick.top': False,
 'ytick.left': False,
 'ytick.right': False,
 'axes.spines.left': True,
 'axes.spines.bottom': True,
 'axes.spines.right': True,
 'axes.spines.top': True}

自定义样式,style可以传递一个dict对象,对坐标轴各项参数进行配置。

sns.set_theme(style=style)
plt.show()

自带5种主题风格样式。

  • darkgrid(默认值):深色网格主题。
data=sns.load_dataset("tips")
sns.set_theme(style="darkgrid")
# sns.set_style("darkgrid")
# sns.axes_style("darkgrid")
sns.relplot(data=data,x="total_bill",y="tip")
plt.show()

在这里插入图片描述

  • whitegrid:浅色网格主题。
sns.set_theme(style="whitegrid")
# sns.set_style("whitegrid")
# sns.axes_style("whitegrid")
sns.relplot(data=data,x="total_bill",y="tip")
plt.show()

在这里插入图片描述

  • dark:深色主题,没有网格。
sns.set_theme(style="dark")
# sns.set_style("dark")
# sns.axes_style("dark")
sns.relplot(data=data,x="total_bill",y="tip")
plt.show()

在这里插入图片描述

  • white:浅色主题,没有网格。
sns.set_theme(style="white")
# sns.set_style("white")
# sns.axes_style("white")
sns.relplot(data=data,x="total_bill",y="tip")
plt.show()

在这里插入图片描述

  • ticks:深色主题,带有刻度标记。
sns.set_theme(style="ticks")
# sns.set_style("ticks")
# sns.axes_style("ticks")
sns.relplot(data=data,x="total_bill",y="tip")
plt.show()

在这里插入图片描述

用rc覆盖样式中部分参数。

sns.set_theme(style="whitegrid",rc={
   "grid.color": ".6", "grid.linestyle": ":"})
# sns.set_style("whitegrid",{"grid.color": ".6", "grid.linestyle": ":"})
# sns.axes_style("darkgrid", rc={'axes.grid':True})

context设置

context可以对标签、线条和绘图的其他元素的大小进行配置。

通过以下设置来应用尺寸绘图:

  • set_theme(context)
  • sns.set_context()
  • sns.plotting_context()

三个函数同参数。

示例:

自定义context。

context = {
   'font.size': 15.0,
 'axes.labelsize': 'medium',
 'axes.titlesize': 'large',
 'xtick.labelsize': 'medium',
 'ytick.labelsize': 'medium',
 'legend.fontsize': 'medium',
 'axes.linewidth': 0.8,
 'grid.linewidth': 0.8,
 'lines.linewidth': 1.5,
 'lines.markersize': 6.0,
 'patch.linewidth': 1.0,
 'xtick.major.width': 0.8,
 'ytick.major.width': 0.8,
 'xtick.minor.width': 0.6,
 'ytick.minor.width': 0.6,
 'xtick.major.size': 3.5,
 'ytick.major.size': 3.5,
 'xtick.minor.size': 2.0,
 'ytick.minor.size': 2.0,
 'legend.title_fontsize': None}

sns.set_theme(context=context)
sns.relplot(data=data,x="total_bill",y="tip")

Seaborn自带的几中context选项。

  • notebook(默认值):稍大的尺寸
sns.set_theme(context="notebook")
sns.relplot(x="total_bill",y="tip",data=data)
plt.show()

在这里插入图片描述

  • paper:最小的尺寸
sns.set_theme(context="paper")
sns.relplot(x="total_bill",y="tip",data=data)
plt.show()

在这里插入图片描述

  • talk:更大的尺寸
sns.set_theme(context="talk")
sns.relplot(x="total_bill",y="tip",data=data)
plt.show()

在这里插入图片描述

  • poster:最大的尺寸
sns.set_theme(context="poster")
sns.relplot(x="total_bill",y="tip",data=data)
plt.show()

在这里插入图片描述

palette颜色盘设置

通过以下设置来应用颜色盘:

  • sns.set_theme(palette)
  • sns.set_palette()
  • sns.color_palette()

三个函数同参数,参数可以是:

  • seaborn的palette名称(颜色盘名称):deep,muted,bright,pastel,dark,colorblind等。
  • “husl"或"hls”,表示huls颜色系统或者hsl颜色系统。
  • 关键字处理颜色:“light:”,“dark:”,“blend:”
  • matplotlib的colormap名称(颜色列表),比如"Blues",“BuGn_r”,“GnBu_d”,“Oranges”,“coolwarm”。

示例:获取颜色盘,返回一个颜色列表。

sns.color_palette()

在这里插入图片描述

sns.set_theme(palette="husl")
sns.color_palette("husl",6)
# sns.set_theme(palette=sns.color_palette("husl",6))
# sns.set_palette("husl",6)
sns.relplot(data=data,x="total_bill",y="tip",hue="size")
plt.show()

在这里插入图片描述

despine控制边框

  • despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)方法包含参数如下:

    • fig:matplotlib figure,optional。
    • ax:matplotlib axes, optional,控制特定的子图对象的边框,如果不指定,则默认为整个figure对象。
    • top,right,left,bottom:True表示删除对应方向的边界框。
    • offset:代表x和y坐标轴偏移量。
    • trim:False表示坐标轴没有限制,True表示将坐标轴限制在最大最小值之间。

示例:

sns.despine():删除图像上的上侧和右侧的坐标轴线。

plt.figure(figsize=(10,5))
x=np.linspace(0,14,100)
sns.set_style("ticks")

for i in range(5):
	sns.lineplot(x=x,y=np.sin(x+i*0.5)*(7-i))

sns.despine()

plt.title("despine")
plt.show()

在这里插入图片描述

sns.despine(right,left,top,bottom):自定义隐藏边框。

sns.set_style("ticks")
data=np.random.normal(size=(20,6))+np.arange(6)/2

# ticks风格原图
plt.figure()
sns.boxplot(data=data)
plt.title("origin")
plt.show()

在这里插入图片描述

# 隐藏左侧和右侧边框后的图
plt.figure()
sns.boxplot(data=data)
sns.despine(right=True,left=True,top=False,bottom=False)
plt.title("despined")
plt.show()

在这里插入图片描述

sns.despine(offset,trim):边框位移。

x=np.linspace(0,14,100)
fig=plt.figure(figsize=(10,7))

for i in range(5):
	sns.lineplot(x=x,y=np.cos(x+i*0.5)*(7-i))
sns.despine(offset=50,trim=True) # 图像与x轴和y轴之间的距离都是50,而x轴的坐标轴刻度范围是从0-14,y轴的坐标轴刻度范围是从-6到6。
plt.title("trim=True")
plt.show()

在这里插入图片描述

x=np.linspace(0,14,100)
fig=plt.figure(figsize=(10,7))
for i in range(5):
	sns.lineplot(x=x,y=np.cos(x+i*0.5)*(7-i))
sns.despine(offset=50) # 图像与x轴和y轴之间的距离都是50
plt.title("trim=False")
plt.show()

在这里插入图片描述


三、Seaborn函数分类

根据图形控制级别分类

Seaborn绘图函数根据图形层级分为两种类型:

  • axes级:绘图函数在间个axes上绘图,函数返回值 就是axes对象。
    • 多个axes级函数可以在同一个axes中叠加绘图,在函数中用ax参数指定要绘图的axes。
  • figure级:绘图函数在figure上绘图,返回一个FaceGrid对象,类似Figure对象,可以管理figure。
    • 函数api统一。
    • 容易进行figure级参数设置。
    • 可以在坐标系外部绘制图例(figure级别图例)。

注意: 多个axes级函数可以在同一个axes中叠加绘图,但figure级函数不行。

根据绘图函数功能分类

Seaborn绘图函数根据功能可以分为5个大类21种图,分别关系类图表、分类图表、分布图表、回归图、矩阵图。每组功能都提供一个figure级函数(可以实现本组函数绘图函数功能,api统一),同时提供若干个axes级函数。

Relational plots 关系类图表

  • relplot() 关系类图表的接口,figure级函数,其实是下面两种图的集成,通过指定kind参数可以画出下面的两种图:
    • scatterplot() 散点图,axes级函数
    • lineplot() 折线图,axes级函数

Categorical plots 分类图表

  • catplot() 分类图表的接口,figure级函数,其实是下面八种图表的集成,通过指定kind参数可以画出下面的八种图:
    • stripplot() 分类散点图,axes级函数
    • swarmplot() 能够显示分布密度的分类散点图,axes级函数
    • boxplot() 箱图,axes级函数
    • violinplot() 小提琴图,axes级函数
    • boxenplot() 增强箱图,axes级函数
    • pointplot() 点图,axes级函数
    • barplot() 条形图,axes级函数
    • countplot() 计数图,axes级函数

Distribution plot 分布图

  • distplot() 直方图,质量估计图,figure级函数
    • histplot() 直方图,axes级函数。
    • kdeplot() 核函数密度估计图,axes级函数
    • ecdfplot() 累积分布图,axes级函数
    • rugplot() 将数组中的数据点绘制为轴上的数据,地毯图,axes级函数

还有两个特殊的figure级函数,将多个子图组合的图形。

  • jointplot()函数,返回JointGrid对象。同时绘制3个子图,在绘制二维图的基础上,在图形上方和右侧绘制分布图。
  • pairplot()函数,返回PairGrid对象。(配对分布统计图)

Regression plots 回归图

  • lmplot() 回归模型图,figure级函数
    • regplot() 线性回归图,axes级函数
    • residplot() 线性回归残差图,axes级函数

Matrix plots 矩阵图

  • clustermap() 聚集图,figure级函数
    • heatmap() 热力图,axes级函数

几乎所有axes级函数绘制的图形,都可以用figure级函数实现相同的效果。

四、Seaborn绘图数据

Seaborn支持多种不同数据集格式,大多数函数接受pandas、numpy以及python类型(如列表、字典)数据。

numpy数组数据绘图

import numpy as np
import seaborn as sns
import matplotlob.pyplot as plt

#准备数据
x=np.linspace(0,4*np.pi,100)
y=np.sin(x)

#绘图
sns.replot(x=x,y=y,kind="line")

#显示图形
plt.show()

pandas数组数据绘图

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 准备数据
df=pd.DataFrame({
   'x':[1,2,3,4,5],'y':[1,3,2,4,5]})

# 绘图
sns.relplot(x='x',y='y',data=df,kind='line')

#显示图形
plt.show()

长格式、短格式数据绘图

长格式、短格式数据形式:

1、长格式

长格式数据,变量由键唯一定义

import pandas as pd
import numpy as np
df=pd.DataFrame({
   "year":[2020]*12+[2021]*12+[2022]*12+[2023]*12+[2024]*12,
"month":['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']*5,"passengers":np.random.choice(np.arange(100,500),60)})

在这里插入图片描述

2、宽格式

宽格式数据,变量由表头定义

df=df.pivot(index="year",columns="month",values="passengers")

在这里插入图片描述

长格式数据绘图

seaborn可以直接用长格式数据绘图,用hue参数指定用于分组的列(即转宽格式后变为列标签的列)。

import seaborn as sns                #惯例将seaborn导入为sns
import matplotlib.pyplot as plt      #显示图形还是需要依靠matplotlib

sns.relplot(data=df,x="year",y="passengers",hue="month",kind="line")
plt.show()

在这里插入图片描述

sns.relplot(data=df,x="month",y="passengers",hue="year",kind="line")
plt.show()

在这里插入图片描述

宽格式数据绘图

宽格式每列绘图:

宽格式数据中,每列都是一个数据系列,可以绘制一条曲线,默认情况下,不

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值