查看全课大纲(第 23 / 45 节)

散点图 气泡图

散点图与气泡图:探索数据关系的二维与三维表达

小象实战讲义 · ECharts 数据可视化

在数据分析中,我们常常需要探究两个或多个变量之间的关系。散点图是揭示两个数值变量之间关联性的经典工具,而气泡图则在此基础上,巧妙地引入了第三个维度。本节我们将学习如何使用 pyecharts 绘制这两种图表,直观地展示数据的相关性、分布与趋势,为后续构建复杂的数据关系可视化图表打下基础。

💡 核心导读

  • 散点图:用于展示两个连续变量(X轴与Y轴)之间的关系,是识别相关性(正相关、负相关、不相关)和发现数据异常值的利器。
  • 坐标轴类型陷阱:在 pyecharts 中绘制数值型散点图时,必须显式设置坐标轴类型为 "value",否则默认的 "category" 类型会导致数据定位错误。
  • 气泡图:本质上是散点图的扩展,通过点的大小(或颜色)来编码第三个数值变量,实现三维数据在二维平面上的可视化。
  • 视觉映射器 (visualMap):是气泡图的核心配置,通过 type_="size" 或 type_="color" 将数值范围映射到视觉元素(气泡大小或颜色),增强图表的信息承载能力。
  • 数据与因果:散点图能有效展示变量间的相关性,但必须牢记“相关性不等于因果性”,这是数据分析中的重要原则。

一、散点图:揭示两个变量的关系

散点图(Scatter Plot)将数据以点的形式绘制在直角坐标系中,每个点的位置由其对应的 X 和 Y 坐标值决定。它主要用于:

  1. 观察关系:判断两个变量之间是否存在某种关联(线性、非线性)。
  2. 识别模式:发现数据的集群、离群点(异常值)或趋势。
  3. 评估相关性:直观感受变量间是正相关(同增同减)、负相关(此增彼减)还是不相关。

1.1 基础散点图绘制

让我们从一个经典的数据集开始,绘制一个基础的散点图。

# 引入必要的库
from pyecharts import options as opts
from pyecharts.charts import Scatter

# 准备数据:一个包含 [x, y] 坐标对的列表
data = [
    [10.0, 8.04],
    [8.0, 6.95],
    [13.0, 7.58],
    [9.0, 8.81],
    [11.0, 8.33],
    [14.0, 9.96],
    [6.0, 7.24],
    [4.0, 4.26],
    [12.0, 10.84],
    [7.0, 4.82],
    [5.0, 5.68],
]

# 使用列表推导式分离X轴和Y轴数据
x_data = [d[0] for d in data]
y_data = [d[1] for d in data]

print(f"X轴数据: {x_data}")
print(f"Y轴数据: {y_data}")
print(f"数据点数量: {len(data)}")
X轴数据: [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0]
Y轴数据: [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]
数据点数量: 11
# 绘制基础散点图
scatter_chart = (
    Scatter()
    .add_xaxis(xaxis_data=x_data)          # 添加X轴数据
    .add_yaxis(
        series_name="数据系列",             # 系列名称
        y_axis=y_data,                     # Y轴数据
        symbol_size=20                      # 设置点的大小
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="基础散点图示例"),
        # 注意:此处尚未设置X轴类型,将导致问题
    )
)

# 打印图表类型和系列信息作为摘要
print(f"图表类型: {type(scatter_chart).__name__}")
print(f"系列名称: 数据系列")
print(f"X轴数据点: {len(x_data)} 个")
print(f"Y轴数据点: {len(y_data)} 个")
图表类型: Scatter
系列名称: 数据系列
X轴数据点: 11 个
Y轴数据点: 11 个

注意:上面的代码生成的图表在渲染时,X轴坐标的显示和点的位置可能会出现问题,因为X轴默认被当作分类数据处理。这是我们接下来要解决的关键点。

1.2 关键配置:设置数值型坐标轴

在 pyecharts(基于 ECharts 6 资源)中,坐标轴默认类型是 “category”(类目轴),适用于柱状图的分类标签。对于散点图,X轴和Y轴通常都是连续的数值,必须显式设置为 “value”(数值轴)。

# 正确绘制散点图:设置坐标轴类型为数值型
correct_scatter = (
    Scatter()
    .add_xaxis(x_data)
    .add_yaxis("数据系列", y_data, symbol_size=20)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="正确配置的散点图"),
        # 关键配置:将X轴类型设置为数值轴
        xaxis_opts=opts.AxisOpts(type_="value", name="X变量"),
        # Y轴通常也会是数值轴,最好也明确设置
        yaxis_opts=opts.AxisOpts(type_="value", name="Y变量"),
    )
)

print("图表配置摘要:")
print("- X轴类型已设置为 'value'")
print("- Y轴类型已设置为 'value'")
print("- 坐标轴名称: X变量, Y变量")
图表配置摘要:
- X轴类型已设置为 'value'
- Y轴类型已设置为 'value'
- 坐标轴名称: X变量, Y变量
横纵轴均为数值轴的散点图,数据点按坐标分散分布
图:正确配置的散点图:横纵轴都是数值轴,点按坐标散开,不会被默认类目轴挤成一列。手机端可左右滑动查看,点击图片可看全图。

经过此配置,图表中的点将根据其真实的数值坐标(如 (4.0, 4.26))被准确定位在坐标系中,X轴也会按照数值大小自动排序和缩放。

1.3 解读散点图:相关性分析

观察散点图中点的分布形态,我们可以对变量关系做出初步判断:

  • 正相关:点集呈现从左下到右上的整体趋势(斜率>0)。
  • 负相关:点集呈现从左上到右下的整体趋势(斜率<0)。
  • 不相关:点集随机分布,无明显趋势。

重要提醒:散点图展示的是相关性,而非因果性。例如,广告投放量与点击率可能正相关,但不能断言“点击率高是因为广告投得多”,可能存在其他共同影响因素。在数据分析中,区分这两者至关重要。

二、气泡图:引入第三维度的散点图

当我们需要同时展示三个数值变量时,气泡图(Bubble Chart)应运而生。它在散点图的基础上,用每个点(气泡)的大小来编码第三个变量(Z值)。有时也会用颜色来编码这第三个维度。

2.1 使用视觉映射器 (VisualMap) 创建气泡图

visualMap 组件是创建气泡图的核心,它负责将数据值(第三个维度)映射到视觉通道(大小或颜色)。

# 引入Faker生成示例数据
from pyecharts.faker import Faker
import random

# 固定随机种子,确保结果可复现
random.seed(2024)

# 生成数据:X轴,Y轴,以及决定气泡大小的第三维数据
x_values = Faker.days_attrs  # 例如: ['1a', '2a', ...]
y_values = [random.randint(5, 35) for _ in range(len(x_values))]

print(f"X轴标签示例: {x_values[:3]}...")
print(f"Y轴数据示例: {y_values[:3]}...")
print(f"第三维数据(大小)范围: 5 ~ 35")
X轴标签示例: ['0天', '1天', '2天']...
Y轴数据示例: [20, 10, 28]...
第三维数据(大小)范围: 5 ~ 35
# 绘制气泡图:大小映射
bubble_chart = (
    Scatter()
    .add_xaxis(x_values)
    .add_yaxis(
        series_name="",
        y_axis=y_values,
        # 不显示数据标签,避免与气泡重叠
        label_opts=opts.LabelOpts(is_show=False)
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="气泡图示例 - 大小映射"),
        # 核心:配置视觉映射器,类型为'size'
        visualmap_opts=opts.VisualMapOpts(
            type_="size",        # 映射到气泡大小
            min_=5,              # 数据最小值对应的大小
            max_=35,             # 数据最大值对应的大小
            # range_size 可控制气泡大小的像素范围,例如 [10, 50]
        ),
        xaxis_opts=opts.AxisOpts(type_="category"), # X轴为分类标签
        yaxis_opts=opts.AxisOpts(type_="value"),
    )
)

print("气泡图配置摘要:")
print("- visualMap 类型: size")
print(f"- Y值样本范围: {min(y_values)} ~ {max(y_values)}")
print("- Y轴为数值,X轴为分类")
气泡图配置摘要:
- visualMap 类型: size
- Y 值样本范围: 10 ~ 35
- Y轴为数值,X轴为分类
气泡散点图,点的大小随第三个数值变量变化
图:气泡图:点的大小映射第三个数值维度,一张图里可以同时表达三个变量。手机端可左右滑动查看,点击图片可看全图。

生成的图表中,Y值大的点,其气泡也更大,直观地传达了三个维度的信息。

2.2 颜色映射与多系列气泡图

visualMap 也可以映射到颜色,或者我们可以绘制多个数据系列进行对比。

# 示例:两个系列的气泡图,使用颜色映射
scatter_multi = (
    Scatter()
    .add_xaxis(Faker.choose()[:6])  # 取6个分类
    .add_yaxis("产品A", [random.randint(20, 80) for _ in range(6)])
    .add_yaxis("产品B", [random.randint(30, 90) for _ in range(6)])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="多系列气泡图对比"),
        visualmap_opts=opts.VisualMapOpts(
            type_="color",  # 映射到颜色
            min_=20,
            max_=90,
            # 可以定义颜色区间,例如 ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
        ),
        # 添加图例
        legend_opts=opts.LegendOpts(pos_top="10%"),
    )
)

print("多系列气泡图摘要:")
print("- 系列数量: 2 (产品A, 产品B)")
print("- visualMap 类型: color")
print("- X轴分类数: 6")
多系列气泡图摘要:
- 系列数量: 2 (产品A, 产品B)
- visualMap 类型: color
- X轴分类数: 6

三、使用建议与常见问题

3.1 图表选用指南

  • 选用散点图:当你的分析目标是探索两个连续数值变量之间的关系、寻找异常值或观察数据分布时。
  • 选用气泡图:当需要在上述基础上,额外强调或比较第三个连续数值变量时。气泡大小比颜色更能精确传达数值差异。
  • 避免使用:数据量极少(难以观察趋势),或变量是分类数据(应使用柱状图或饼图)。

3.2 确保可视化效果

  1. 足够的数据量:散点图需要一定数量的数据点才能清晰呈现趋势或相关性模式。
  2. 区分数据系列:当有多个系列时,使用显著不同的颜色或标记形状,并利用图例进行说明。
  3. 调整透明度:当数据点非常密集导致重叠时(过绘制),可以设置点的透明度(itemstyle_opts=opts.ItemStyleOpts(opacity=0.6))来改善。
  4. 坐标轴标签:为数值轴添加清晰的名称和单位,帮助读者理解变量含义。

📝 动手练一练

  1. 修复错误图表:以下代码试图绘制一个展示“学习时间”与“考试成绩”关系的散点图,但X轴显示异常。请找出问题并修正。
    from pyecharts.charts import Scatter
    from pyecharts import options as opts
    study_hours = [1, 2, 3, 4, 5, 6]
    exam_scores = [55, 63, 71, 78, 85, 88]
    chart = (Scatter()
             .add_xaxis(study_hours)
             .add_yaxis("成绩", exam_scores)
             .set_global_opts(title_opts=opts.TitleOpts(title="学习时间 vs 考试成绩")))

    <details>
    <summary> 点击查看参考答案</summary>

    **问题**:X轴默认为 `type_="category"`,导致数值 `[1,2,3,4,5,6]` 被当作分类标签处理,坐标轴顺序和点的定位可能不符合数值逻辑。
    **修正**:在 `set_global_opts` 中添加 `xaxis_opts=opts.AxisOpts(type_="value", name="学习时间(小时)")`。
    ```text
    corrected_chart = (
        Scatter()
        .add_xaxis(study_hours)
        .add_yaxis("成绩", exam_scores)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="学习时间 vs 考试成绩"),
            xaxis_opts=opts.AxisOpts(type_="value", name="学习时间(小时)"),
            yaxis_opts=opts.AxisOpts(type_="value", name="考试成绩"),
        )
    )
</details>

2. 创建气泡图:假设你有一组城市数据,包含“人均GDP(X轴)”、“人均寿命(Y轴)”和“人口数量(决定气泡大小)”。请描述如何使用 pyecharts 的 Scatter 和 VisualMapOpts 来绘制这个气泡图,并说明 visualmap_opts 中 type_ 参数应设置为什么。

<details>
<summary> 点击查看参考答案</summary>

1.  **数据准备**:准备三个列表:`gdp_per_capita`(X轴),`life_expectancy`(Y轴),`population`(决定大小)。
2.  **绘制图表**:
    ```text
    chart = (
        Scatter()
        .add_xaxis(gdp_per_capita)
        .add_yaxis("城市", life_expectancy)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="城市发展气泡图"),
            xaxis_opts=opts.AxisOpts(type_="value", name="人均GDP"),
            yaxis_opts=opts.AxisOpts(type_="value", name="人均寿命"),
            visualmap_opts=opts.VisualMapOpts(
                type_="size",          # 关键:将人口数量映射到气泡大小
                min_=min(population),
                max_=max(population),
                # 可添加 range_size=[10, 50] 控制大小范围
            ),
        )
    )
    3.  **参数说明**:`type_="size"` 表示将数据值(人口数量)映射到图形元素(点)的尺寸上。若想用颜色表示人口多少,则可设为 `type_="color"`。
    </details>

## 本章小结
本节我们掌握了数据关系可视化的两种基础且强大的图表:散点图与气泡图。散点图是分析两个变量相关性的起点,而气泡图通过引入视觉映射,成功地在二维平面上表达了三维信息。记住设置正确的坐标轴类型是避免踩坑的关键一步。

### 📋 行动清单
- [ ] **练习绘制**:使用你自己的或公开的数据集(如鸢尾花数据集),用散点图探索其中两个数值特征的关系。
- [ ] **配置验证**:在 pyecharts 官方示例或文档中,找到散点图/气泡图的例子,亲手运行并尝试修改 `visualMap` 的 `type_`、`min_`、`max_` 等参数,观察图表变化。
- [ ] **思考应用**:在你的工作或学习项目中,找一个适合用气泡图展示“三个关键指标”的场景,并构思其图表设计。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 06_数据关系可视化.ipynb · ECharts 课程配套资源
    IPYNB · 章级代码与输出
    下载