现在位置: 首页 > Matplotlib 教程 > 正文

Matplotlib scatter() 函数


Matplotlib 参考文档 Matplotlib 参考文档

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, yarray-like数据点的 x 和 y 坐标(必填)
sfloat 或 array-like点的大小,可以是标量(所有点相同)或数组(每个点不同大小)
ccolor 或 array-like点的颜色,可以是固定颜色或数值数组(配合 cmap 映射颜色)
markerstr标记形状:'o'(圆)、's'(方块)、'^'(上三角)、'v'(下三角)、'D'(菱形)、'*'(星)、'+'(加号)、'x'(叉号) 等,默认 'o'
cmapstr 或 Colormap颜色映射,当 c 是数值数组时使用,如 'viridis', 'plasma'
normNormalize数据到颜色映射的归一化方式
vmin, vmaxfloat颜色映射的数据范围,超出范围的点将被裁剪
alphafloat 或 array-like透明度,0-1 之间
linewidthsfloat 或 array-like点边缘线宽
edgecolorscolor 或 array-like点边缘颜色,'face' 使用填充色,'none' 无边缘
labelstr图例标签

scatter() 的核心优势在于 scalpha 可以是与 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()

示例 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()

示例 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()

示例 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()

常见问题

scatter() 和 plot() 的区别?

plot() 适用于折线图,所有点共享相同的颜色和标记样式,渲染效率高。

scatter() 适用于散点图,每个点可独立设置大小和颜色,但每个点都是独立 Artist,大数据量时较慢。

数据点很多(数万以上)时,优先考虑 plot() 配合指定标记来提升性能。

s 参数的单位是什么?

s 表示点的面积(单位为平方点 points^2),而非直径。

例如 s=100s=400,后者面积是前者的 4 倍,直径约为前者的 2 倍。


Matplotlib 参考文档 Matplotlib 参考文档