前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于seaborn绘制多子图

基于seaborn绘制多子图

原创
作者头像
皮大大
发布2023-09-09 13:58:36
5370
发布2023-09-09 13:58:36
举报
文章被收录于专栏:机器学习/数据可视化

公众号:尤而小屋 作者:Peter 编辑:Peter

大家好,我是Peter~

之前也写过一些关于seaborn的文章,本文给大家介绍如何使用seaborn来绘制多子图

seaborn简介

Seaborn是一个Python数据可视化库,建立在Matplotlib之上,专注于创建美观、有吸引力的统计图表。它为数据科学家和分析师提供了一种简单易用的方式来可视化数据,使得数据探索和分析变得更加直观和有效。

Seaborn提供了一系列内置的图表样式和颜色主题,使得用户无需费力地进行定制即可创建各种类型的图表,包括散点图、折线图、条形图、箱型图、核密度估计图等。除了常见的统计图表外,Seaborn还支持高级功能,如多面板图、数据分组和分类、线性回归模型拟合等。

这个库的优势之一是能够直接操作Pandas数据框架,因此可以轻松地从DataFrame对象中提取数据,并且自动适应数据的特征来调整图表的外观。Seaborn的代码简洁易懂,使得用户可以更专注于数据分析和展示,而不必过多关注图表的细节设置。

总体而言,Seaborn为Python用户提供了一种优雅而强大的方式来展示数据,使得数据可视化成为数据科学工作流程中不可或缺的一部分。无论是在探索性数据分析还是向他人传达分析结果,Seaborn都是一个非常有价值的工具。

导入库

In 1:

代码语言:txt
复制
import matplotlib.pyplot as plt 
%matplotlib inline

import seaborn as sns
import plotly_express as px

import warnings
warnings.filterwarnings("ignore")

导入数据

In 2:

代码语言:txt
复制
# 内置的tips数据 基于seaborn导入方法
# tips = sns.load_dataset("tips")

In 3:

代码语言:txt
复制
# 基于plotly_express
tips = px.data.tips()
tips.head(3)

Out3:

total_bill

tip

sex

smoker

day

time

size

0

16.99

1.01

Female

No

Sun

Dinner

2

1

10.34

1.66

Male

No

Sun

Dinner

3

2

21.01

3.50

Male

No

Sun

Dinner

3

In 4:

代码语言:txt
复制
gdp = px.data.gapminder()
gdp.head(3)

Out4:

country

continent

year

lifeExp

pop

gdpPercap

iso_alpha

iso_num

0

Afghanistan

Asia

1952

28.801

8425333

779.445314

AFG

4

1

Afghanistan

Asia

1957

30.332

9240934

820.853030

AFG

4

2

Afghanistan

Asia

1962

31.997

10267083

853.100710

AFG

4

In 5:

代码语言:txt
复制
iris = px.data.iris()
iris.head(3)

Out5:

sepal_length

sepal_width

petal_length

petal_width

species

species_id

0

5.1

3.5

1.4

0.2

setosa

1

1

4.9

3.0

1.4

0.2

setosa

1

2

4.7

3.2

1.3

0.2

setosa

1

基于FacetGrid

Seaborn中的FacetGrid是一个多维数据图形接口,通过使用它,我们可以方便地创建基于不同的分面变量的多个图形。

FacetGrid可以通过col和row等参数来一次性构建多个图形,例如使用relplot、catplot、lmplot等函数在一个Figure中绘制多个图。

这个函数之所以有这些功能,是因为函数底层使用了FacetGrid来组装这些图形。

FacetGrid绘图的x和y参数必须为DataFrame的列的名字。

In 6:

代码语言:txt
复制
g = sns.FacetGrid(tips, col="time")

g表示的就是待绘图的画布;而且是基于time字段进行绘制多子图。这样后续我们就可以在对象g上进行绘图。

直方图histplot

In 7:

代码语言:txt
复制
g = sns.FacetGrid(tips, col="time")
g.map(sns.histplot, "tip")

散点图scatterplot

In 8:

代码语言:txt
复制
g = sns.FacetGrid(tips, col="sex", hue="smoker")  # 1

g.map(sns.scatterplot, "total_bill", "tip", alpha=.8)  # 2
g.add_legend()  # 3

解释下代码:

  • 第一行:col参数表示列方向的分组字段,hue表示颜色的分组
  • 第二行:sns.scatterplot表示绘制散点图,使用total_billtip两个字段绘制,alpha表示散点的透明度
  • 第三行:表示添加图例,右侧的smoker(No-Yes);否则不会显示图例legend

回归散点图regplot

In 9:

代码语言:txt
复制
g = sns.FacetGrid(tips, 
                  row="smoker",  # 行
                  col="time",  # 列
                  margin_titles=True  # 标题显示:True-表示行列分开,False-合并显示
                 )

g.map(sns.regplot, 
      "size", "total_bill", 
      # color=".2",   # color="red"
      # fit_reg=False, 是否显示拟合的回归线;默认是True
      x_jitter=.1
     )

箱型图barplot

In 10:

代码语言:txt
复制
g = sns.FacetGrid(tips, 
                  col="day", # 列元素分组
                  height=4, # 控制高
                  aspect=.6  # 控制宽
                 )

g.map(sns.barplot,
      "sex", "total_bill",  # x-y轴
      order=["Male", "Female"] # 指定横轴sex中的显示顺序
     )

# g.add_legend()

核密度估计图kdeplot

kdeplot是Seaborn库中的一个函数,用于绘制核密度估计图。

核密度估计是一种非参数统计方法,用于估计数据样本的密度函数。它通过使用核函数和权重来计算每个数据点的密度,并将所有密度值组合成一条连续的曲线,从而展示数据样本的分布特征。

In 11:

代码语言:txt
复制
 tips.day.value_counts()

Out11:

代码语言:txt
复制
Sat     87
Sun     76
Thur    62
Fri     19
Name: day, dtype: int64

表示按照每天出现的数量降序排列:

In 12:

代码语言:txt
复制
ordered_days = tips.day.value_counts().index
ordered_days

Out12:

代码语言:txt
复制
Index(['Sat', 'Sun', 'Thur', 'Fri'], dtype='object')

In 13:

代码语言:txt
复制
g = sns.FacetGrid(tips, 
                  row="day", # 行方向
                  row_order=ordered_days,  # 使用上面指定的顺序
                  height=1.5, 
                  aspect=4)

g.map(sns.kdeplot, "total_bill")

多图(个数可控)

如果某个字段的取值存在多种情况,可以使用wrap。如果使用wrap,不能使用row参数。

比如gdp数据中的year字段:

In 14:

代码语言:txt
复制
gdp["year"].value_counts()  # 总共12个年份

Out14:

代码语言:txt
复制
1952    142
1957    142
1962    142
1967    142
1972    142
1977    142
1982    142
1987    142
1992    142
1997    142
2002    142
2007    142
Name: year, dtype: int64

In 15:

代码语言:txt
复制
gdp.columns

Out15:

代码语言:txt
复制
Index(['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap',
       'iso_alpha', 'iso_num'],
      dtype='object')

In 16:

代码语言:txt
复制
g = sns.FacetGrid(gdp, 
                  col="year",  # 列方向
                  col_wrap=4   # 分成4列,所以每行3个图(12个年份)  
                 )

g.map(sns.scatterplot, "lifeExp", "pop")

设置风格style

In 17:

代码语言:txt
复制
with sns.axes_style("white"):
    g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, height=2.5)
    
g.map(sns.scatterplot, "total_bill", "tip", color="#334488")

g.set_axis_labels("Total bill (US Dollars)", "Tip")  # 设置x轴的名称
g.set(xticks=[10, 30, 50], yticks=[2, 6, 10])  # 设置x-y轴的范围

g.figure.subplots_adjust(wspace=0.5,  # 左右子图的宽
                         hspace=.3  # 上下子图的高
                        )

基于PairGrid(散点矩阵图)

针对数值型字段绘图

In 18:

代码语言:txt
复制
g = sns.PairGrid(iris.iloc[:,:-1])

g.map(sns.scatterplot)

在tips数据中,存在三个数值型字段:

In 19:

代码语言:txt
复制
tips.dtypes

Out19:

代码语言:txt
复制
total_bill    float64
tip           float64
sex            object
smoker         object
day            object
time           object
size            int64
dtype: object

只会针对数据中的数值型字段进行绘图:

In 20:

代码语言:txt
复制
g = sns.PairGrid(tips)  

g.map(sns.scatterplot)

对角线绘制不同图形

在对角线和非对角线分别绘制不同的图形:

In 21:

代码语言:txt
复制
g = sns.PairGrid(iris)
g.map_diag(sns.histplot)  # 对角线
g.map_offdiag(sns.scatterplot)  # 非对角线

通过hue参数选择不同的分组:

In 22:

代码语言:txt
复制
g = sns.PairGrid(iris,hue="species")

g.map_diag(sns.histplot)  # 对角线
g.map_offdiag(sns.scatterplot)  # 非对角线

选择部分的字段绘图:通过vars参数指定

In 23:

代码语言:txt
复制
g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"], hue="species")

g.map(sns.scatterplot)

g.add_legend()

上三角、下三角和对角线分别绘制不同类型的图:

In 24:

代码语言:txt
复制
g = sns.PairGrid(iris)

g.map_upper(sns.scatterplot)  # 上三角
g.map_lower(sns.kdeplot)  # 下三角
g.map_diag(sns.kdeplot, lw=3, legend=False) # 对角线

行列使用不同变量绘图(非正方形)

In 25:

代码语言:txt
复制
g = sns.PairGrid(tips, 
                 x_vars=["total_bill", "size"],  # 同一个y对应两个x的值
                 y_vars=["tip"],                
                 height=4)

g.map(sns.regplot, color="0.2")
g.set(ylim=(-1, 11), yticks=[0, 5, 10])

同样地,可以使用hue参数:

In 26:

代码语言:txt
复制
g = sns.PairGrid(tips, hue="size", palette="GnBu_d")

# g.map(plt.scatter, s=50, edgecolor="white")  # 等效如下
g.map(sns.scatterplot, s=50, edgecolor="white")  
g.add_legend()

基于pariplot绘图

在Seaborn中,sns.pairplot()函数可以用于绘制数据的配对图。配对图是一种可视化方法,用于显示两个变量之间的相关性和依赖关系。sns.pairplot()函数可以同时绘制多个变量,并在图上显示它们之间的所有配对关系。

基于hue分组绘图

In 27:

代码语言:txt
复制
sns.pairplot(iris, hue="species", height=2.5)
指定对角线绘图类型diag_kind

In 28:

代码语言:txt
复制
g = sns.pairplot(iris,  # 数据
                 hue="species", # 分组 
                 palette="Paired",  # 调色板  Set2  Paired  colorblind deep  muted  bright
                 diag_kind="kde",  # 对角线绘图类型
                 height=2.5  # 高度
                )

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • seaborn简介
  • 导入库
  • 导入数据
  • 基于FacetGrid
    • 直方图histplot
      • 散点图scatterplot
        • 回归散点图regplot
          • 箱型图barplot
            • 核密度估计图kdeplot
              • 多图(个数可控)
                • 设置风格style
                • 基于PairGrid(散点矩阵图)
                  • 针对数值型字段绘图
                    • 对角线绘制不同图形
                      • 行列使用不同变量绘图(非正方形)
                        • 基于pariplot绘图
                          • 基于hue分组绘图
                          • 指定对角线绘图类型diag_kind
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档