前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >70个精美图快速上手seaborn!

70个精美图快速上手seaborn!

原创
作者头像
皮大大
发布2023-05-31 00:35:04
2.3K0
发布2023-05-31 00:35:04
举报

大家好,我是Peter~

今天给大家带来一篇关于可视化库seaborn库的文章。

Seaborn简介

Seaborn是一个基于Python的数据可视化库,它建立在Matplotlib之上,提供了一种更简单、更美观的方式来创建统计图形。Seaborn旨在帮助用户轻松地生成有吸引力和信息丰富的可视化结果。

以下是Seaborn库的一些主要特点:

  1. 美观的默认样式:Seaborn通过提供现成的样式和颜色主题,使得创建各种类型的图形变得更加简单。它的默认样式经过精心设计,使得图表具有更高的可读性和美观度。
  2. 内置的统计图形:Seaborn提供了一系列内置的统计图形,例如柱状图、箱线图、散点图、折线图等。这些图形不仅易于使用,还具有各种选项和参数,可以帮助你更好地展示和理解数据。
  3. 数据集可视化:Seaborn还包含一些内置的示例数据集,这些数据集可以直接在库中使用。你可以使用这些数据集来快速生成演示图表,同时也可以将它们作为学习和实践的基础。
  4. 统计功能增强:Seaborn提供了许多额外的统计功能,使得数据探索更加方便。例如,你可以使用Seaborn轻松地绘制分布图、拟合回归线、绘制核密度图等。
  5. 多变量数据可视化:Seaborn提供了一些强大的工具来可视化多变量数据。你可以使用Seaborn绘制矩阵图、热力图、聚类图等,以揭示不同变量之间的关系和模式。

seaborn绘图的高级技巧:http://seaborn.pydata.org/examples/different_scatter_variables.html

导入内置数据

seaborn内置了一些数据集:

In 1:

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

import seaborn as sns

导入seaborn内置的消费数据集:

In 2:

代码语言:txt
复制
tips = sns.load_dataset("tips")  # 需要网络环境
tips.head()

Out2:

导入iris数据集:

In 3:

代码语言:txt
复制
iris = sns.load_dataset("iris")  # 需要网络环境
iris

Out3:

下面的图形主要是基于两份数据进行绘制,包含的图形有:

  • 散点图sns.scatter
  • 回归散点图sns.lmplot
  • 分类散点图sns.stripplot
  • 分簇散点图sns.swarmplot
  • 柱状图sns.barplot
  • 计数柱状图sns.countplot
  • 直方图sns.histplot
  • 分布图sns.displot
  • 箱型图sns.boxplot
  • 小提琴图sns.violin
  • 热力图sns.heatmap
  • 聚类热图sns.clustermap
  • 分类图sns.catplot
  • 多图网格sns.FaceGrid

希望帮助读者快速上手seaborn绘图,文章有点长,欢迎点赞收藏。

散点图sns.scatterplot

基础散点图

In 4:

代码语言:txt
复制
sns.scatterplot(x="total_bill",y="tip",data=tips)

plt.title("basic scatter with seaborn")  # 添加标题

plt.show()
进阶散点图

指定散点的大小:

In 5:

代码语言:txt
复制
sns.scatterplot(x="total_bill",
                y="tip",
                size="size", # 指定散点大小
                data=tips)

plt.title("better scatter with seaborn")  # 添加标题

plt.show()

指定hue进行分组:

In 6:

代码语言:txt
复制
sns.scatterplot(x="total_bill",
                y="tip",
                hue="day", # 指定散点大小
                data=tips)

plt.title("better scatter with seaborn")  # 添加标题

plt.show()

回归散点图sns.lmplot

显示散点图中回归趋势线:使用lmplot方法

In 7:

代码语言:txt
复制
sns.lmplot(x="total_bill",
            y="tip",
            hue="time", # 分组
            data=tips)

plt.title("better scatter with seaborn")  # 添加标题

plt.show()

分类散点图sns.stripplot

默认情况

在默认情况下,只会对数据中数值型字段进行绘图:

In 8:

代码语言:txt
复制
sns.stripplot(data=tips)

plt.show()

通过参数orient设置水平或者垂直:

In 9:

代码语言:txt
复制
sns.stripplot(data=tips,orient="h")

plt.show()
基础分类散点图

指定x或者y

In 10:

代码语言:txt
复制
# 水平
sns.stripplot(data=tips, x="tip")

plt.show()

指定为y轴绘图:

In 11:

代码语言:txt
复制
# 垂直
sns.stripplot(data=tips, y="tip")

plt.show()
进阶分类散点图

水平方向:

In 12:

代码语言:txt
复制
sns.stripplot(data=tips, x="tip",y="day")

plt.show()

垂直方向:

In 13:

代码语言:txt
复制
sns.stripplot(data=tips, x="day", y="tip")

plt.show()

通过hue指定分组:

In 14:

代码语言:txt
复制
sns.stripplot(data=tips, x="day", y="tip", hue="smoker")

plt.show()

设置多个其他参数:

In 15:

代码语言:txt
复制
sns.stripplot(
    data=tips, # 指定数据、x、y轴
    x="total_bill", 
    y="day", 
    hue="time",  # 分组字段
    jitter=False,   # 抖动点
    s=20,  # 控制点的大小
    marker="D",  # D-方形  S-圆点
    linewidth=1,  # 线宽
    alpha=.3  # 透明度
)

plt.show()

分簇散点图sns.swarmplot

默认情况

在默认情况下,只会对数据中数值型字段进行绘图:

In 16:

代码语言:txt
复制
sns.swarmplot(data=tips)

plt.show()

通过orient指定水平方向:

In 17:

代码语言:txt
复制
sns.swarmplot(data=tips,orient='h')

plt.show()
基础分簇散点图

In 18:

代码语言:txt
复制
# 水平
sns.swarmplot(data=tips, x="total_bill")

plt.show()

指定在y轴上绘图:

In 19:

代码语言:txt
复制
# 水平
sns.swarmplot(data=tips, y="total_bill")

plt.show()

同时指定x和y

In 20:

代码语言:txt
复制
sns.swarmplot(data=tips,x="time", y="total_bill")

plt.show()
进阶分簇散点图

In 21:

代码语言:txt
复制
sns.swarmplot(data=tips,
              x="time", 
              y="total_bill",
              hue="day", # 指定分组字段
              marker="*",  # 设置marker  默认是圆点
              size=7,  # 设置marker大小
              linewidth=0.5  # 设置线宽
             )

plt.show()

柱状图sns.barplot

基础柱状图

如果只给定x和y,barplot方法实际上进行一个聚合汇总求均值的操作:

In 22:

代码语言:txt
复制
tips.groupby("day")["tip"].mean()

Out22:

代码语言:txt
复制
day
Fri     2.734737
Sat     2.993103
Sun     3.255132
Thur    2.771452
Name: tip, dtype: float64

In 23:

代码语言:txt
复制
sns.barplot(data=tips,x="day",y="tip")

plt.show()
进阶柱状图

hue参数指定分组的字段:

In 24:

代码语言:txt
复制
sns.barplot(
    data=tips,
    x="day",
    y="tip",
    hue="smoker"  # 指定分组字段
    )

plt.show()

order参数指定x轴label的顺序:

In 25:

代码语言:txt
复制
sns.barplot(
    data=tips,
    x="day",
    y="tip",
    hue="smoker",  # 指定分组
    order=["Thur","Fri","Sat","Sun"] # 指定x轴label的顺序
    )

plt.show()
水平柱状图

orient参数指定水平h或者垂直v

In 26:

代码语言:txt
复制
sns.barplot(
    data=tips,
    x="tip",  # x轴的数据必须为数值
    y="day",
    hue="smoker",
    orient="h"
    )

plt.show()

计数柱状图sns.countplot

用于统计DataFrame中某个字段的不同取值数量。比如我们想统计sex中不同性别下的人数:

In 27:

代码语言:txt
复制
tips.groupby("sex").size()

Out27:

代码语言:txt
复制
sex
Female     87
Male      157
dtype: int64

可以看到统计结果:Female是87人,Male是157人

In 28:

代码语言:txt
复制
# 写法1
# sns.countplot(tips["sex"])

# 写法2
sns.countplot(data=tips,x="sex")
plt.show()

也可以指定不同的分组:

In 29:

代码语言:txt
复制
sns.countplot(data=tips,
              x="sex",
              hue="day"  # 指定分组
             )

plt.show()

绘制水平柱状图:

In 30:

代码语言:txt
复制
sns.countplot(data=tips,
              y="sex",  # 将x改成y即可
              hue="day"  # 指定分组
             )

plt.show()

直方图sns.histplot

默认情况

如果不传入x和y,默认是对DataFrame中所有的数值字段进行操作:

In 31:

代码语言:txt
复制
sns.histplot(data=tips)

plt.show()
基础直方图

传入x或者y的情况:

In 32:

代码语言:txt
复制
sns.histplot(data=tips,x="tip")
# sns.histplot(x=tips["tip"])  等价

plt.show()

In 33:

代码语言:txt
复制
# fill表示是否填充柱子
sns.histplot(data=tips,x="tip",fill=False)  

plt.show()

改成水平方向柱状图:

In 34:

代码语言:txt
复制
sns.histplot(data=tips,y="tip")
# sns.histplot(y=tips["tip"])  等价

plt.show()
进阶直方图

binwidth控制每个柱子的宽度;bins控制柱子的个数

In 35:

代码语言:txt
复制
sns.histplot(data=tips,x="tip",binwidth=0.1,bins=50)

plt.show()

kde开启直方图与核密度图同时显示:

In 36:

代码语言:txt
复制
sns.histplot(data=tips,x="tip",kde=True)

plt.show()

In 37:

代码语言:txt
复制
sns.histplot(data=tips,x="tip",hue="day") # 指定分组情况

plt.show()

In 38:

代码语言:txt
复制
sns.histplot(data=tips,
             x="tip",
             hue="day",
             multiple="stack"  # 以堆叠的形式显示
            ) 

plt.show()

In 39:

代码语言:txt
复制
sns.histplot(data=tips,
             x="tip", 
             hue="day",# 分组
             stat="density", # 密度图(y轴刻度)
             element="step")  # bars  step  poly ;控制密度图显示方式,默认bars

plt.show()

In 40:

代码语言:txt
复制
sns.histplot(data=tips,
             x="tip", 
             hue="day",# 分组
             stat="density", # 密度图(y轴刻度)
             element="poly")  # bars step poly ;控制密度图显示方式

plt.show()

分布图sns.displot

基础分布图

默认情况下是统计DataFrame中某个属性中不同取值出现的次数:以柱状图的形式显示

In 41:

代码语言:txt
复制
tips.groupby("tip").size()

Out41:

代码语言:txt
复制
tip
1.00     4
1.01     1
1.10     1
1.17     1
1.25     3
        ..
6.70     1
6.73     1
7.58     1
9.00     1
10.00    1
Length: 123, dtype: int64

In 42:

代码语言:txt
复制
sns.displot(data=tips,x="tip")
# sns.displot(data=tips["tip"])  等价

plt.show()
进阶分布图

In 43:

代码语言:txt
复制
sns.displot(data=tips,x="tip",hue="sex")  # 指定分组

plt.show()

使用kind参数,取值为:'hist', 'kde', 'ecdf'。hist就是上面默认的情况:

In 44:

代码语言:txt
复制
sns.displot(data=tips,x="tip",kind="kde")  
# sns.kdeplot(data=tips,x="tip")  等价于kdeplot

plt.show()

ecdf表示累计求和的效果:

In 45:

代码语言:txt
复制
# empirical cumulative distribution functions (ECDFs)

sns.displot(data=tips,x="tip",kind="ecdf")   

plt.show()

使用直方图结合核密度图:

In 46:

代码语言:txt
复制
sns.displot(data=tips,x="tip",kde=True)

plt.show()

箱型图sns.boxplot

基础箱型图

In 47:

代码语言:txt
复制
# sns.boxplot(tips["tip"])  # 等价1;默认是x=tips["tip"]
# sns.boxplot(data=tips, x="tip")  # 等价2
sns.boxplot(x=tips["tip"])
plt.show()

如果指定为y=tips["tip"],则变成垂直箱型图:

In 48:

代码语言:txt
复制
# sns.boxplot(data=tips, y="tip")  # 等价

sns.boxplot(y=tips["tip"])
plt.show()

同时指定x和y:

In 49:

代码语言:txt
复制
sns.boxplot(data=tips, x="day",y="tip")
plt.show()

交换x和y的位置变成水平箱型图:

In 50:

代码语言:txt
复制
sns.boxplot(data=tips, y="day",x="tip")
plt.show()
进阶箱型图

hue执行分组,此时x和y必须同时指定:

In 51:

代码语言:txt
复制
# hue执行分组

sns.boxplot(data=tips, x="day",y="tip",hue="sex")
plt.show()

dodge参数表示在执行hue分组的时候,不同组别下的数据是否放在一个主体中:

In 52:

代码语言:txt
复制
sns.boxplot(data=tips, x="day",y="tip",hue="sex",dodge=False)
plt.show()

设置多个绘图参数:

In 53:

代码语言:txt
复制
sns.boxplot(data=tips,
            x="day",
            y="tip",
            hue="sex",
            showcaps=False,  # 是否显示箱须(横线部分)
            notch=True  # 是否开启显示V型槽(箱体凹槽)
           )
plt.show()

小提琴图sns.violinplot

基础小提琴图

In 54:

代码语言:txt
复制
# sns.violinplot(tips["tip"])  # 默认是x=tips["tip"]
# sns.violinplot(x=tips["tip"])  

sns.violinplot(data=tips,x="tip")

plt.show()

垂直小提琴图:

In 55:

代码语言:txt
复制
# sns.violinplot(data=tips,y="tip")

sns.violinplot(y=tips["tip"])

plt.show()
进阶小提琴图

In 56:

代码语言:txt
复制
sns.violinplot(data=tips, x="sex",y="tip",hue="day")

plt.show()

交换x和y的位置,变成水平小提琴图:

In 57:

代码语言:txt
复制
# 交换x和y的位置

sns.violinplot(data=tips, y="sex",x="tip",hue="day")

plt.show()

设置其他参数:

In 58:

代码语言:txt
复制
sns.violinplot(data=tips, 
               y="sex",
               x="tip",
               hue="day",
               inner="stick"   # 控制内部虚线
              )

plt.show()

热力图sns.heatmap

基础热力图

指定条件下的透视表:

In 59:

代码语言:txt
复制
table = pd.pivot_table(tips,values="tip",columns=["day"],index=["sex"],aggfunc="mean")
table

Out59:

In 60:

代码语言:txt
复制
sns.heatmap(table)  # 默认

plt.show()
进阶热力图

In 61:

代码语言:txt
复制
# 显示文本信息及保留一位小数;设置线宽
sns.heatmap(table, # 数据
            annot=True,  # 显示文本
            fmt=".1f", # 保留一位小数
            linewidths=0.5,  # 设置线宽
            vmin=2,  # 颜色棒的最大值和最小值
            vmax=3.5,
            cbar=True,  # 是否显示右边的颜色棒
            cmap="crest"  # 色谱选择   cmap=sns.cubehelix_palette(as_cmap=True)
           )  

plt.show()

将x轴刻度显示在上面:

In 62:

代码语言:txt
复制
fig = sns.heatmap(table, annot=True,fmt=".1f")
fig.set(xlabel="",ylabel="")
fig.xaxis.tick_top()

聚类热图sns.clustermap

基础聚类热图

In 63:

代码语言:txt
复制
iris.dtypes

Out63:

代码语言:txt
复制
sepal_length    float64
sepal_width     float64
petal_length    float64
petal_width     float64
species          object
species_id        int64
dtype: object

In 64:

代码语言:txt
复制
# 删除species字段,因为它的取值为字符串信息

iris_new = iris.drop("species",axis=1)
iris_new.head()

Out64:

默认情况下的聚类热力图:

In 65:

代码语言:txt
复制
sns.clustermap(iris_new)

plt.show()
进阶聚类热图

In 66:

代码语言:txt
复制
sns.clustermap(iris_new,
               figsize=(10,6),  # 大小
               cmap="mako",  # 色谱
               standard_scale=1,  # 是否数据缩放标准化(颜色棒取值为0到1)
               row_cluster=True,  # 是否row方向聚类效果(左侧)
              )

plt.show()

分类图sns.catplot

分类图方法sns.catplot主要是通过kind参数来指定生成不同的图形,其作用等效于对应的函数:

  • kind="box":boxplot
  • kind="violin":violinplot
  • kind="point":pointplot
  • kind="bar":barplot
  • kind="count":countplot
  • kind="strip":stripplot
  • kind="swarm":swarmplot
默认情况

在默认情况下,该函数将会生成散点图:

In 67:

代码语言:txt
复制
# 垂直方向

sns.catplot(data=tips,x="day",y="tip")
plt.show()

调换x和y的位置:

In 68:

代码语言:txt
复制
# 水平方向
sns.catplot(data=tips,y="day",x="tip")
plt.show()
kind参数

通过kind参数指定生成不同图形:

In 69:

代码语言:txt
复制
sns.catplot(data=tips,
            x="day",
            y="tip",
            kind="bar")
plt.show()

In 70:

代码语言:txt
复制
sns.catplot(data=tips,
            x="day",
            y="tip",
            kind="box")
plt.show()

In 71:

代码语言:txt
复制
sns.catplot(data=tips,
            x="day",
            y="tip", 
            kind="violin"
           )
plt.show()

In 72:

代码语言:python
复制
sns.catplot(data=tips,
            x="day",
            y="tip",
            kind="swarm")
plt.show()

多图网格sns.FacetGrid

如何理解seaborn.FacetGrid函数?

(1)传入绘图数据

In 73:

代码语言:txt
复制
sns.FacetGrid(tips)

Out73:

(2)指定行、列元素

In 74:

代码语言:txt
复制
sns.FacetGrid(tips,col="day",row="sex")

Out74:

(3)调用map函数

In 75:

代码语言:txt
复制
f = sns.FacetGrid(tips,col="day",row="sex")

f.map(sns.scatterplot, "total_bill", "tip")

Out75:

In 76:

代码语言:python
复制
f = sns.FacetGrid(tips,col="day",row="sex")

f.map(sns.violinplot, "total_bill")

In 77:

代码语言:python
复制
f = sns.FacetGrid(tips,col="day",row="sex")
f.map(sns.histplot, "total_bill")

(4)调用map_dataframe函数

In 78:

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

f.map_dataframe(sns.barplot, y="total_bill")

Out78:

In 79:

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

f.map_dataframe(sns.scatterplot, x="total_bill",y="tip")

Out79:

In 80:

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

f.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex")

f.add_legend()  # 添加图例(右侧)

Out80:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Seaborn简介
    • 导入内置数据
      • 基础散点图
      • 进阶散点图
      • 默认情况
      • 基础分类散点图
      • 进阶分类散点图
      • 默认情况
      • 基础分簇散点图
      • 进阶分簇散点图
      • 基础柱状图
      • 进阶柱状图
      • 水平柱状图
      • 默认情况
      • 基础直方图
      • 进阶直方图
      • 基础分布图
      • 进阶分布图
      • 基础箱型图
      • 进阶箱型图
      • 基础小提琴图
      • 进阶小提琴图
      • 基础热力图
      • 进阶热力图
      • 基础聚类热图
      • 进阶聚类热图
      • 默认情况
      • kind参数
  • 散点图sns.scatterplot
  • 回归散点图sns.lmplot
  • 分类散点图sns.stripplot
  • 分簇散点图sns.swarmplot
  • 柱状图sns.barplot
  • 计数柱状图sns.countplot
  • 直方图sns.histplot
  • 分布图sns.displot
  • 箱型图sns.boxplot
  • 小提琴图sns.violinplot
  • 热力图sns.heatmap
  • 聚类热图sns.clustermap
  • 分类图sns.catplot
  • 多图网格sns.FacetGrid
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档