Matplotlib 散点图函数
在 Matplotlib 中,我们可以使用 scatter() 函数来绘制一个散点图。散点图的主要作用有以下 2 个。
- 变量之间是否存在关联趋势,并且这个关联趋势是线性的还是非线性的。
- 判断是否有离群点(也叫异常点),也就是偏移量比较大的点。
语法:
plt.scatter(x, y)说明:
参数 x 存放的是所有点的 x 轴坐标,参数 y 存放的是所有点的 y 轴坐标,它们可以是列表、数组、Series 等。
提示: 如果想要了解如何绘制 3D 散点图,另请参阅:Matplotlib 3D 散点图。
示例 1:基本散点图
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [15, 12, 14, 12, 11, 14, 13, 12]
plt.scatter(x, y)
# 显示
plt.show()运行之后,效果如下图所示。

示例 2:正态分布散点图
import matplotlib.pyplot as plt
import numpy as np
# 绘图
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x, y, alpha=0.8)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
np.random.randn(n) 用于生成 n 个符合正态分布的样本数据。
Matplotlib 散点图样式
在 Matplotlib 中,为了让散点图更加的美观,scatter() 函数还提供了很多用于定义样式的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| marker | 散点的形状 |
| s | 散点的大小(size) |
| color | 散点的颜色(color) |
| alpha | 散点的透明度(0.0~1.0) |
示例 3:散点的形状
import matplotlib.pyplot as plt
# 绘图
x= [1, 2, 3, 4, 5, 6, 7, 8]
y = [15, 12, 14, 12, 11, 14, 13, 12]
plt.scatter(x, y, marker='x')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
marker='x' 用于定义散点的形状为 “x”。marker 参数的取值有非常多,它的取值和折线图 plot() 函数中的 marker 参数的取值是一样的,小伙伴们可以翻一下 “Matplotlib 折线图” 这一节。
示例 4:颜色、大小、透明度
import matplotlib.pyplot as plt
# 绘图
x= [1, 2, 3, 4, 5, 6, 7, 8]
y = [15, 12, 14, 12, 11, 14, 13, 12]
plt.scatter(x, y, s=80, color='red', alpha=0.3)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
plt.scatter(x, y, s=80, color='red', alpha=0.3) 表示定义散点的大小为 80,颜色为红色,透明度为 0.3。
Matplotlib 散点图案例
在当前项目下的 data 文件夹中有一个 clothes.csv 文件,项目结构如下图所示。其中,clothes.csv 文件保存的某衣服店一年内每个月中上衣和裤子的销量(单位:件),内容如下图所示。


示例 5:一组散点
import pandas as pd
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/clothes.csv')
# 绘制图表
plt.scatter(df['月份'], df['上衣'])
# 显示
plt.show()运行之后,效果如下图所示。

示例 6:多组散点
import pandas as pd
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/clothes.csv')
# 绘制图表
plt.scatter(df['月份'], df['上衣'])
plt.scatter(df['月份'], df['裤子'], marker='v')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
想要同时绘制多组散点,我们只需要调用多次 scatter() 函数就可以了。当然了,为了区分不同组,我们可以使用 marker 来改变一下散点的外观。
Matplotlib 气泡图
在 Matplotlib 中,我们可以使用 scatter() 函数的 s 参数来绘制一个气泡图。需要注意的是,此时 s 参数的值要求是一个列表。
示例 7:气泡图
import matplotlib.pyplot as plt
# 绘图
x = range(1,11)
y = [8, 38, 22, 43, 10, 39, 54, 33, 52, 16]
plt.scatter(x, y, s=y)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
参数 s 代表了点的大小,它的值可以是一个整数,也可以是一个列表。当取值为整数时,表示所有点的大小是一样的;当取值为列表时,此时会根据列表的值来定义每一个点的大小。
如果我们将 s 设置成与每个散点的数据大小一样,那么散点的大小就代表了数据的大小了,这样呈现出来的效果就是一个 “气泡图”。
其实上面这个例子的效果并不是很明显,我们可以让列表 y 中所有元素同时放大 5 倍,然后再赋值给参数 s,请看下面例子。
示例 8:改进后
import matplotlib.pyplot as plt
# 绘图
x = range(1,11)
y = [8, 38, 22, 43, 10, 39, 54, 33, 52, 16]
# 将元素放大5倍
sizes = [item*5 for item in y]
plt.scatter(x, y, s=sizes)
# 显示
plt.show()运行之后,效果如下图所示。

示例 9:气泡使用不同颜色
import matplotlib.pyplot as plt
import random
# 生成随机颜色
def randomcolor():
colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
color = ''
for i in range(6):
color += colorArr[random.randint(0,14)]
return '#'+color
# 生成随机颜色的列表
colors = []
for i in range(10):
colors.append(randomcolor())
# 绘图
x = range(1,11)
y = [8, 38, 22, 43, 10, 39, 54, 33, 52, 16]
sizes = [item*5 for item in y]
plt.scatter(x, y, s=sizes, color=colors)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
参数 color 和参数 s 一样,它除了可以是一个值之外,还可以是一个列表。当它取值为列表时,表示为每一个元素采用不同的颜色。
