Seaborn 分布散点图

Seaborn 分布散点图函数

在 Seaborn 中,我们可以使用 stripplot() 函数来绘制一个分布散点图。分布散点图和普通的 “Seaborn 散点图” 不一样:普通散点图是用于判断两个变量是否存在关联趋势,而分布散点图是用于查看数据的分布情况

语法:

sns.stripplot(data, x, y)

说明:

strpplot() 函数接收以下主要参数。

  • data(可选):用于定义数据部分,它是一个 DataFrame。
  • x(可选):用于指定 DataFrame 的哪一列作为 x 轴坐标。
  • y(可选):用于指定 DataFrame 的哪一列作为 y 轴坐标。

示例 1:Seaborn 绘制分布散点图

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

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 数据
data = [
    ['张三', 24],
    ['李四', 18],
    ['王五', 37],
    ['小芳', 24],
    ['小红', 12],
    ['小明', 42],
    ['小华', 56],
    ['小莉', 67],
    ['小英', 45],
    ['小军', 82]
]
df = pd.DataFrame(data, columns=['姓名', '年龄'])
# 绘图
sns.stripplot(data=df, x='年龄')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 分布散点图

分析:

分布散点图其实是把每一个数据点都绘制在画布上,这样我们就可以非常直观地看出所有数据的分布情况。

Seaborn 分布散点图案例

Seaborn 内置了一个数据集 tips,该数据集保存的是某餐厅的营业情况,包括账单、小费、客人信息等,部分内容如下图所示。需要说明的是,“size” 这一列指的是客人订的餐桌类型,比如有些是 2 人桌、有些是 3 人桌等。

Seaborn tips 数据集

示例 2:基本分布散点图

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制
sns.stripplot(data=df, x='账单')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 基本分布散点图

分析:

对于这个例子来说,x 轴坐标是 “账单” 的大小,然后表中每一个点都对应于 “账单” 这一列中的一个数据。

示例 3:多个分布散点图

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制图表
sns.stripplot(data=df, x='星期', y='账单')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 多个分布散点图

分析:

对于这个例子来说,x 轴坐标是 “星期”,取值共有 4 种:Thur(周四)、Fri(周五)、Sat(周六)、Sun(周日)。然后 y 轴坐标是 “账单”。由于 “星期” 共有 4 种取值,所以这里绘制了 4 个分布散点图出来,每一个小提琴图都是独立的。

对于这个例子来说,如果想要将分布散点图改为横向显示,我们只需要将 x 和 y 这两个参数的取值调换就可以了。修改后的代码如下,此时效果如下图所示。

sns.stripplot(data=df, x='账单', y='星期')

Seaborn 分布散点图横向显示

示例 4:添加区分

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制图表
sns.stripplot(data=df, x='星期', y='账单', hue='性别')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 分布散点图添加区分

分析:

对于 violinplot() 函数来说,它同样也是只有 hue 参数,而没有 style 和 size 这 2 个参数。所以想要添加区分,我们只能使用 hue 参数来实现。

如果想要把每一个区分都单独的使用一列来展示,我们可以使用 dodge=True 这个参数来实现。修改后的代码如下,此时效果如下图所示。

sns.stripplot(data=df, x='星期', y='账单', hue='性别', dodge=True)

Seaborn 分布散点图单独显示

示例 5:改变顺序

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制图表
sns.stripplot(data=df, x='星期', y='账单', hue='性别', order=['Sun', 'Sat', 'Fri', 'Thur'])

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 分布散点图改变顺序

分析:

如果想要改变顺序,我们可以使用 order 参数来实现。

示例 6:结合箱线图

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制图表
sns.stripplot(data=df, x='星期', y='账单', color='black')
sns.boxplot(data=df, x='星期', y='账单')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 分布散点图结合箱线图

分析:

分布散点图还可以结合箱线图绘制在同一个画布上,此时就等于同时拥有分布散点图和箱线图的功能了。需要注意的是,对于分布散点图来说,我们需要使用 color 参数来重新定义颜色,因为默认的颜色会与箱线图颜色重叠,这样用户体验是比较差的。

对于这个例子来说,当我们把 color='black' 这个参数删除之后,此时可以看到效果如下图所示。

Seaborn 分布散点图删除color='black'

示例 7:结合增强箱线图

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制图表
sns.stripplot(data=df, x='星期', y='账单', color='black')
sns.boxenplot(data=df, x='星期', y='账单')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 分布散点图结合增强箱线图

示例 8:结合小提琴图

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 先画小提琴图(作为底层)
sns.boxenplot(data=df, x='星期', y='账单')
# 再画分布散点图(作为顶层,叠加在上面)
sns.stripplot(data=df, x='星期', y='账单', color='black')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 分布散点图结合小提琴图

分析:

对于分布散点图来说,不管它是结合箱线图、增强箱线图还是小提琴图,绘图函数的调用是不区分顺序的。最后,我们来总结一下 stripplot() 函数的参数,常用的如下表所示。

stripplot() 函数的参数
参数 说明
data 数据部分
x x 轴坐标
y y 轴坐标
hue 添加区分(颜色)
dodge=True 单独显示
order 改变顺序

提示: 如果希望所有的数据点都不重叠,我们可以使用 sns.swarmplot(),它会自动调整点的位置,形成像蜂群一样的效果,非常适合数据量适中的场景。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号