查看全课大纲(第 23 / 45 节)
- 1.课程简介
- 2.环境搭建
- 3.预备知识
- 4.pyecharts初体验
- 5.数据可视化概述
- 6.数据可视化的目标和作用
- 7.数据可视化工具对比分析
- 8.数据可视化基本流程
- 9.数据可视化设计原则
- 10.pyecharts简介
- 11.官方图表样例
- 12.常用图表的基本结构
- 13.数据格式
- 14.图表的分类
- 15.柱状图与条形图
- 16.其他对比图表
- 17.常用配置项(一)
- 18.常用配置项(二)
- 19.折线图 面积图
- 20.K线图
- 21.其他时间图表
- 22.常用配置项
- 23.散点图 气泡图
- 24.热力图
- 25.其他相关性图表
- 26.饼图
- 27.矩形树图
- 28.其他成分比例图表
- 29.箱型图与直方图
- 30.3D柱状图与折线图
- 31.其他统计图表
- 32.地图 Map
- 33.地理坐标系Geo
- 34.3D 地图
- 35.网络关系图
- 36.主题河流图
- 37.词云图
- 38.组合图表组件
- 39.仪表盘相关图表
- 40.项目介绍
- 41.数据准备
- 42.子图制作(一)
- 43.子图制作(二)
- 44.数据大屏制作
- 45.项目总结
散点图 气泡图
散点图与气泡图:探索数据关系的二维与三维表达
小象实战讲义 · ECharts 数据可视化
在数据分析中,我们常常需要探究两个或多个变量之间的关系。散点图是揭示两个数值变量之间关联性的经典工具,而气泡图则在此基础上,巧妙地引入了第三个维度。本节我们将学习如何使用 pyecharts 绘制这两种图表,直观地展示数据的相关性、分布与趋势,为后续构建复杂的数据关系可视化图表打下基础。
💡 核心导读
- 散点图:用于展示两个连续变量(X轴与Y轴)之间的关系,是识别相关性(正相关、负相关、不相关)和发现数据异常值的利器。
- 坐标轴类型陷阱:在 pyecharts 中绘制数值型散点图时,必须显式设置坐标轴类型为
"value",否则默认的"category"类型会导致数据定位错误。 - 气泡图:本质上是散点图的扩展,通过点的大小(或颜色)来编码第三个数值变量,实现三维数据在二维平面上的可视化。
- 视觉映射器 (visualMap):是气泡图的核心配置,通过
type_="size"或type_="color"将数值范围映射到视觉元素(气泡大小或颜色),增强图表的信息承载能力。 - 数据与因果:散点图能有效展示变量间的相关性,但必须牢记“相关性不等于因果性”,这是数据分析中的重要原则。
一、散点图:揭示两个变量的关系
散点图(Scatter Plot)将数据以点的形式绘制在直角坐标系中,每个点的位置由其对应的 X 和 Y 坐标值决定。它主要用于:
- 观察关系:判断两个变量之间是否存在某种关联(线性、非线性)。
- 识别模式:发现数据的集群、离群点(异常值)或趋势。
- 评估相关性:直观感受变量间是正相关(同增同减)、负相关(此增彼减)还是不相关。
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 确保可视化效果
- 足够的数据量:散点图需要一定数量的数据点才能清晰呈现趋势或相关性模式。
- 区分数据系列:当有多个系列时,使用显著不同的颜色或标记形状,并利用图例进行说明。
- 调整透明度:当数据点非常密集导致重叠时(过绘制),可以设置点的透明度(
itemstyle_opts=opts.ItemStyleOpts(opacity=0.6))来改善。 - 坐标轴标签:为数值轴添加清晰的名称和单位,帮助读者理解变量含义。
📝 动手练一练
- 修复错误图表:以下代码试图绘制一个展示“学习时间”与“考试成绩”关系的散点图,但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 · 章级代码与输出

