Python Matplotlib绘制气泡图:scatter函数基础用法与参数详解

许南星
许南星
发布时间:2026-10-28 | 5人浏览过
原创

深入讲解如何使用Python Matplotlib中的scatter函数绘制气泡图,全面解析x、y、s、c、alpha、cmap等核心参数的含义、面积映射原理及图例标注技巧。

气泡图(Bubble Chart)是多维数据可视化的常用图表形态。它在传统二维直角坐标系散点图的基础上,通过将数据点的“点大小”与“点颜色”分别绑定到第三和第四个数值变量,使得单张静态图表能够直观表达四个维度的联动关系。在 Python 的数据可视化生态中,Matplotlib 库的 matplotlib.pyplot.scatter 函数是构建气泡图的核心底层接口。本文将从气泡图的视觉映射原理出发,系统解析 scatter 函数的关键参数与计算逻辑,并提供可运行的标准代码范式及避坑技巧。

一、气泡图的本质与多维映射原理

普通的二维散点图仅利用水平 X 轴和垂直 Y 轴展示两个连续变量间的相关性。而气泡图则将离散的数据散点赋予了物理属性:圆点的几何大小和色彩深浅。这意味着读者不仅能读取横纵坐标代表的两个度量,还能通过图形面积的宽窄判断规模大小,通过颜色梯度识别指标等级。

Python Matplotlib绘制气泡图:scatter函数基础用法与参数详解
图1:散点图与气泡图维度扩展对比示意图

典型的气泡图场景包括:研究不同国家或地区的经济发展(X轴为人均收入,Y轴为平均寿命,气泡大小为人口总量,气泡颜色为所属大洲);或者评估各产品线的经营表现(X轴为客单价,Y轴为转化率,气泡大小为总销售额,颜色表示利润率)。使用气泡图时,核心原则是数据信息密度适中且各维度具有实际业务逻辑联系,避免无序叠加导致信息过载。

二、plt.scatter() 核心参数详解

Matplotlib 中绘制气泡图的具体调用入口是 matplotlib.pyplot.scatter()。它的参数配置项较为丰富,以下梳理绘制气泡图必知必会的八大核心参数:

参数名称 数据类型/推荐格式 核心作用与说明
x, y 一维数组、Series 或标量列表 定义数据点在二维直角坐标系中的水平与垂直坐标位置(第 1、2 维度)。
s 标量或与 x 等长的一维数组 气泡大小(点面积)。单位为平方磅(points^2)。注意:该参数控制的是散点的面积而非半径。
c 颜色字符串、单色元组或连续数值数组 点颜色映射(第 4 维度)。当传入数值序列时,将与 cmap 配合转化为连续渐变色。
alpha 浮点数(0.0 ~ 1.0) 透明度。由于气泡尺寸较大容易发生前后互相遮挡,通常设置在 0.5 到 0.8 之间以凸显重叠结构。
cmap Colormap 名称字符串(如 'viridis', 'plasma') 色彩映射表。仅当 c 传入数值数组时生效,将数值按分位数或极值线性映射到色彩梯度上。
edgecolors 颜色字符串(如 'white', 'black', 'none') 气泡外边框颜色。在重叠密集或浅色背景下,设置白色或深灰色边框有助于增强单个气泡的边缘识别度。
linewidths 标量或数组 外边框线条宽度。常与 edgecolors 配合,默认值为 None,一般推荐设置为 0.5 到 1.5。
marker 标记形状字符(默认为 'o') 散点几何形状。气泡图通常使用圆形 'o',亦可根据特殊分类需求更换为正方形 's' 等。
Python Matplotlib绘制气泡图:scatter函数基础用法与参数详解
图2:scatter() 核心参数的组织结构与视觉映射定位

三、绘制气泡图的标准步骤与完整代码实战

在实际操作中,绘制一张高质量气泡图不能简单将原始数据列表直接传入 scatter,而是需要经过“数据归一化缩放”、“图形绘制”、“色条与图例标注”等标准流程。下图展示了完整的实现路径:

Python Matplotlib绘制气泡图:scatter函数基础用法与参数详解
图3:标准气泡图开发步骤与数据传递流程

完整可运行代码示例

以下代码模拟了 40 个科技项目的多维表现分析(包含项目周期、投资回报率、资金规模以及团队敏捷度四个维度),展示了如何通过 scatter 完成气泡图的完整构建:

import matplotlib.pyplot as plt
import numpy as np

# 设置系统可用的中文字体支持
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False

# 1. 构造多维样本数据(固定随机种子以保证结果可重现)
np.random.seed(42)
n_projects = 40
x_duration = np.random.uniform(3, 24, n_projects)       # 维度1 (X轴):研发周期(月)
y_roi = x_duration * 1.5 + np.random.normal(0, 8, n_projects) # 维度2 (Y轴):投资回报率 (%)
raw_funding = np.random.uniform(50, 800, n_projects)    # 维度3 (气泡大小):融资金额(万元)
color_score = np.random.uniform(60, 98, n_projects)     # 维度4 (气泡颜色):团队敏捷度得分

# 2. 对气泡大小进行适度缩放映射(映射到 80 ~ 1200 像素平方之间,避免过大或过小)
funding_normalized = (raw_funding - raw_funding.min()) / (raw_funding.max() - raw_funding.min())
bubble_sizes = 80 + funding_normalized * 1120

# 3. 创建画布并执行绘制
fig, ax = plt.subplots(figsize=(10, 6), dpi=100)

scatter_plot = ax.scatter(
    x=x_duration,
    y=y_roi,
    s=bubble_sizes,
    c=color_score,
    cmap='viridis',
    alpha=0.72,
    edgecolors='#FFFFFF',
    linewidths=1.2
)

# 4. 配置标题与坐标轴标签
ax.set_title("研发项目投资回报率与周期多维气泡分析", fontsize=15, pad=15)
ax.set_xlabel("研发周期 (月)", fontsize=12)
ax.set_ylabel("投资回报率 (%)", fontsize=12)
ax.grid(True, linestyle='--', alpha=0.5, color='#CBD5E1')

# 5. 添加颜色条(Colorbar)以解释颜色变量
cbar = fig.colorbar(scatter_plot, ax=ax)
cbar.set_label("团队敏捷度得分 (分)", fontsize=11)

# 6. 为气泡大小手动构建参考图例(说明不同大小气泡代表的资金量)
reference_funding = [100, 400, 800]
legend_handles = []
for val in reference_funding:
    # 按照相同的缩放公式反推显示尺寸
    norm_val = (val - raw_funding.min()) / (raw_funding.max() - raw_funding.min())
    plot_size = 80 + norm_val * 1120
    handle = ax.scatter([], [], s=plot_size, c='#6487A5', alpha=0.6,
                        edgecolors='#333333', linewidths=1.0, label=f"{val} 万元")
    legend_handles.append(handle)

ax.legend(handles=legend_handles, title="融资金额", loc="upper left",
          frameon=True, facecolor='#FAFAF7', edgecolor='#E2E8F0', fontsize=10)

plt.tight_layout()
plt.show()

四、进阶技巧与常见陷阱规避

很多初学者在初次绘制气泡图时,往往会发现做出的图表视觉失真严重,或者大圆完全压制了小圆。以下是绘制气泡图必须掌握的三个关键原则:

Python Matplotlib绘制气泡图:scatter函数基础用法与参数详解
图4:气泡图常见视觉失真陷阱与正确实现方式

1. 深刻理解参数 s 的“面积”属性

在几何学中,圆的面积公式为 \(S = \pi r^2\)。人眼在感知圆形物体的大小时,下意识判断的是其占有的视界面积,而非单维度的半径。Matplotlib 设计非常科学,其 s 参数代表的就是散点的面积(以 points^2 为单位)。

避坑提示:如果你手里有一列数值(如公司营业额),请直接将其线性缩放后传递给 s。千万不要试图将其当作半径 \(r\) 计算出 \(\pi r^2\) 再传给 s,否则视觉面积将按照原数据的四次方膨胀,造成严重的夸大与误导。

2. 防止重叠遮挡的两大手段

当散点数量较多或气泡尺寸较大时,中心聚集处极易发生“大泡遮小泡”。此时可通过以下方式优化:

  • 引入透明度:将 alpha 设定在 0.5 到 0.75 之间。半透明的叠加不仅能透出被遮挡的底层气泡,还能在重叠区域形成自然的颜色加深,反向反映数据聚集密度。
  • 增加高对比度外轮廓:添加 edgecolors='white' 与 linewidths=1.0。白色边框能清晰勾勒出每一个圆的前后景交界,极大提升层次感。
  • 按气泡大小逆序绘制:在绘制前对数据按 s 从大到小排序,先画大泡再画小泡,确保小气泡始终绘制在大气泡的上方。

3. 尺寸图例的手动构建机制

Matplotlib 的 plt.colorbar() 只能自动为 c 映射生成渐变色条,但无法自动为 s 生成气泡大小图例。如果画面上只有不同大小的气泡而没有参照刻度,读者将无法获知其具体代表的数值范围。

规范的做法是使用虚拟数据点(Proxy Artists):通过循环选择 3 到 4 个有代表性的典型数值(如最小、中位数、最大值),调用 ax.scatter([], [], s=size, label='...') 生成空坐标句柄,再传给 ax.legend() 完成图例渲染,正如第三节完整示例所示。

五、总结

在 Python 数据分析与报表交付中,Matplotlib 的 scatter 函数为构建四维交互图表提供了坚实可靠的底层支持。掌握 scatter 绘制气泡图的核心在于:

  1. 明确各个视觉通道的职责分配:位置(X/Y)承载主要相关性,面积(s)表达规模总量,色彩(c)表达状态类别或效率指标。
  2. 牢记 s 对应的是几何面积,进行合理的值域缩放,避免绝对值过大撑破画布或过小缩成盲点。
  3. 搭配 alpha 透明度与 edgecolors 轮廓线消除遮挡,并务必配齐色彩条与尺寸图例,使多维数据图表具备完整的可读性。
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表