Matplotlib scatter() 函数
scatter() 用于绘制散点图,每个数据点可独立设置大小、颜色和透明度。
与 plot() 不同,scatter() 允许每个点有不同的外观属性,适合展示三维或四维数据的分布关系。
函数定义
pyplot 接口
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker='o', cmap=None,
norm=None, vmin=None, vmax=None, alpha=None, linewidths=None,
edgecolors=None, **kwargs)
Axes 接口
Axes.scatter(x, y, s=None, c=None, marker='o', cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None,
**kwargs)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| x, y | array-like | 数据点的 x 和 y 坐标(必填) |
| s | float 或 array-like | 点的大小,可以是标量(所有点相同)或数组(每个点不同大小) |
| c | color 或 array-like | 点的颜色,可以是固定颜色或数值数组(配合 cmap 映射颜色) |
| marker | str | 标记形状:'o'(圆)、's'(方块)、'^'(上三角)、'v'(下三角)、'D'(菱形)、'*'(星)、'+'(加号)、'x'(叉号) 等,默认 'o' |
| cmap | str 或 Colormap | 颜色映射,当 c 是数值数组时使用,如 'viridis', 'plasma' |
| norm | Normalize | 数据到颜色映射的归一化方式 |
| vmin, vmax | float | 颜色映射的数据范围,超出范围的点将被裁剪 |
| alpha | float 或 array-like | 透明度,0-1 之间 |
| linewidths | float 或 array-like | 点边缘线宽 |
| edgecolors | color 或 array-like | 点边缘颜色,'face' 使用填充色,'none' 无边缘 |
| label | str | 图例标签 |
scatter() 的核心优势在于
s、c、alpha可以是与 x/y 等长的数组,这使得一张散点图可以同时展示 3-4 个维度的数据信息。
使用示例
示例 1:基本散点图
实例
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
fig, ax = plt.subplots(layout='constrained')
ax.scatter(x, y, color='steelblue', edgecolors='white',
linewidth=0.5, s=80)
ax.set_title('Basic Scatter Plot')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.grid(True, alpha=0.3)
plt.show()
import numpy as np
# 生成随机数据
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
fig, ax = plt.subplots(layout='constrained')
ax.scatter(x, y, color='steelblue', edgecolors='white',
linewidth=0.5, s=80)
ax.set_title('Basic Scatter Plot')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.grid(True, alpha=0.3)
plt.show()
示例 2:大小和颜色都变化(展示多维数据)
实例
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 100
# 四个维度的数据
x = np.random.rand(n) * 10 # 维度1: x 坐标
y = np.random.rand(n) * 10 # 维度2: y 坐标
colors = np.random.rand(n) * 100 # 维度3: 颜色(数值)
sizes = np.random.rand(n) * 300 # 维度4: 大小
alpha_values = np.random.rand(n) * 0.7 + 0.3 # 维度5: 透明度
fig, ax = plt.subplots(figsize=(8, 6), layout='constrained')
scatter = ax.scatter(x, y,
c=colors, # 颜色随数据变化
s=sizes, # 大小随数据变化
alpha=0.6, # 固定透明度
cmap='viridis', # 颜色映射
edgecolors='white',
linewidth=0.5)
# 添加颜色条
cbar = fig.colorbar(scatter, ax=ax)
cbar.set_label('Color Value')
ax.set_title('Multi-dimensional Scatter Plot')
ax.set_xlabel('X Coordinate')
ax.set_ylabel('Y Coordinate')
ax.grid(True, alpha=0.2)
plt.show()
import numpy as np
np.random.seed(42)
n = 100
# 四个维度的数据
x = np.random.rand(n) * 10 # 维度1: x 坐标
y = np.random.rand(n) * 10 # 维度2: y 坐标
colors = np.random.rand(n) * 100 # 维度3: 颜色(数值)
sizes = np.random.rand(n) * 300 # 维度4: 大小
alpha_values = np.random.rand(n) * 0.7 + 0.3 # 维度5: 透明度
fig, ax = plt.subplots(figsize=(8, 6), layout='constrained')
scatter = ax.scatter(x, y,
c=colors, # 颜色随数据变化
s=sizes, # 大小随数据变化
alpha=0.6, # 固定透明度
cmap='viridis', # 颜色映射
edgecolors='white',
linewidth=0.5)
# 添加颜色条
cbar = fig.colorbar(scatter, ax=ax)
cbar.set_label('Color Value')
ax.set_title('Multi-dimensional Scatter Plot')
ax.set_xlabel('X Coordinate')
ax.set_ylabel('Y Coordinate')
ax.grid(True, alpha=0.2)
plt.show()
示例 3:多组散点对比
实例
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
# 生成三组不同分布的数据
group1_x = np.random.normal(2, 0.5, 100)
group1_y = np.random.normal(2, 0.5, 100)
group2_x = np.random.normal(6, 0.5, 100)
group2_y = np.random.normal(6, 0.5, 100)
group3_x = np.random.normal(4, 1.0, 100)
group3_y = np.random.normal(4, 1.0, 100)
fig, ax = plt.subplots(figsize=(8, 6), layout='constrained')
# 每组使用不同的颜色和标记
ax.scatter(group1_x, group1_y, c='#e74c3c', marker='o',
s=60, label='Group A (tight cluster)')
ax.scatter(group2_x, group2_y, c='#2ecc71', marker='s',
s=60, label='Group B (tight cluster)')
ax.scatter(group3_x, group3_y, c='#3498db', marker='^',
s=60, label='Group C (spread cluster)')
ax.set_title('Multi-group Scatter Comparison')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True, alpha=0.2)
plt.show()
import numpy as np
np.random.seed(42)
# 生成三组不同分布的数据
group1_x = np.random.normal(2, 0.5, 100)
group1_y = np.random.normal(2, 0.5, 100)
group2_x = np.random.normal(6, 0.5, 100)
group2_y = np.random.normal(6, 0.5, 100)
group3_x = np.random.normal(4, 1.0, 100)
group3_y = np.random.normal(4, 1.0, 100)
fig, ax = plt.subplots(figsize=(8, 6), layout='constrained')
# 每组使用不同的颜色和标记
ax.scatter(group1_x, group1_y, c='#e74c3c', marker='o',
s=60, label='Group A (tight cluster)')
ax.scatter(group2_x, group2_y, c='#2ecc71', marker='s',
s=60, label='Group B (tight cluster)')
ax.scatter(group3_x, group3_y, c='#3498db', marker='^',
s=60, label='Group C (spread cluster)')
ax.set_title('Multi-group Scatter Comparison')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True, alpha=0.2)
plt.show()
示例 4:带颜色条的散点图(气泡图)
实例
import matplotlib.pyplot as plt
import numpy as np
# 模拟数据:不同城市的人口、GDP 和所属区域
np.random.seed(42)
n = 30
population = np.random.randint(50, 500, n) # 人口(决定气泡大小)
gdp = np.random.randint(100, 1000, n) # GDP(决定颜色深浅)
region = np.random.choice(['North', 'South', 'East', 'West'], n)
x = np.random.rand(n) * 100
y = np.random.rand(n) * 100
fig, ax = plt.subplots(figsize=(9, 6), layout='constrained')
scatter = ax.scatter(x, y,
s=population, # 气泡大小 = 人口
c=gdp, # 气泡颜色 = GDP
cmap='YlOrRd', # 黄-橙-红颜色映射
alpha=0.7,
edgecolors='gray',
linewidth=0.5)
ax.set_title('Bubble Chart: City Population vs GDP')
ax.set_xlabel('X Coordinate')
ax.set_ylabel('Y Coordinate')
# 添加颜色条,标注为 GDP
cbar = fig.colorbar(scatter, ax=ax, label='GDP')
ax.grid(True, alpha=0.2)
plt.show()
import numpy as np
# 模拟数据:不同城市的人口、GDP 和所属区域
np.random.seed(42)
n = 30
population = np.random.randint(50, 500, n) # 人口(决定气泡大小)
gdp = np.random.randint(100, 1000, n) # GDP(决定颜色深浅)
region = np.random.choice(['North', 'South', 'East', 'West'], n)
x = np.random.rand(n) * 100
y = np.random.rand(n) * 100
fig, ax = plt.subplots(figsize=(9, 6), layout='constrained')
scatter = ax.scatter(x, y,
s=population, # 气泡大小 = 人口
c=gdp, # 气泡颜色 = GDP
cmap='YlOrRd', # 黄-橙-红颜色映射
alpha=0.7,
edgecolors='gray',
linewidth=0.5)
ax.set_title('Bubble Chart: City Population vs GDP')
ax.set_xlabel('X Coordinate')
ax.set_ylabel('Y Coordinate')
# 添加颜色条,标注为 GDP
cbar = fig.colorbar(scatter, ax=ax, label='GDP')
ax.grid(True, alpha=0.2)
plt.show()
常见问题
scatter() 和 plot() 的区别?
plot() 适用于折线图,所有点共享相同的颜色和标记样式,渲染效率高。
scatter() 适用于散点图,每个点可独立设置大小和颜色,但每个点都是独立 Artist,大数据量时较慢。
数据点很多(数万以上)时,优先考虑 plot() 配合指定标记来提升性能。
s 参数的单位是什么?
s 表示点的面积(单位为平方点 points^2),而非直径。
例如 s=100 和 s=400,后者面积是前者的 4 倍,直径约为前者的 2 倍。

Matplotlib 参考文档