查看全课大纲(第 43 / 51 节)
- 1.Python 是什么?为什么值得学?
- 2.如何为 Python 编程准备一个“全家桶”环境?
- 3.Python 有哪几种执行方法?
- 4.行与缩进到底有什么用?
- 5.注释有什么用,怎么写?
- 6.变量:如何给数据起个好名字?
- 7.运算符的优先级和常见坑点是什么?
- 8.Python 中,数字和布尔值究竟有哪几种?
- 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
- 10.如何将程序的结果展示给用户或保存下来?
- 11.CSV 文件怎么读怎么写才方便?
- 12.列表是什么,如何创建和访问它?
- 13.列表的修改操作,有哪些方法?
- 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
- 15.判断语句:如何让程序根据条件做不同的事?
- 16.for 循环如何遍历序列中的元素?
- 17.while 循环什么时候才会停?
- 18.while 循环的结束条件,你写对了吗?
- 19.循环中途想提前结束,怎么办?
- 20.`break` 和 `continue` 到底有什么区别?
- 21.列表推导式如何让代码更简洁高效?
- 22.字符串怎么定义、拼接和操作?
- 23.元组:为什么定义单个元素时要加逗号?
- 24.集合(set)怎么用?如何快速去重和做集合运算?
- 25.字典是什么,为什么比列表更方便?
- 26.字典的增删改查与遍历,如何避免 KeyError?
- 27.函数里的变量,为什么有的能用有的不能用?
- 28.在函数内部修改全局变量,为什么有时不生效?
- 29.函数里能修改全局变量吗?返回值怎么用?
- 30.匿名函数:如何用 lambda 快速定义简单函数?
- 31.面向对象编程是什么,为什么需要它?
- 32.类中的方法和属性到底怎么定义和使用?
- 33.如何控制对对象内部属性和方法的访问?
- 34.异常发生时,程序会怎样继续执行?
- 35.如何组织代码:包和模块
- 36.`if __name__ == '__main__'` 到底有什么用?
- 37.如何用 IDE 的 Debug 功能排查程序错误?
- 38.Matplotlib 绘图的第一步该做什么?
- 39.Figure 是什么,如何设置图形尺寸?
- 40.如何自定义 Matplotlib 的坐标轴?
- 41.如何为图表添加图例,让不同曲线一目了然?
- 42.饼图怎么画才能直观展示数据占比?
- 43.如何用 Matplotlib 绘制散点图?
- 44.柱状图怎么画?
- 45.如何使用 Matplotlib 绘制等高线图?
- 46.如何在 Matplotlib 中绘制子图?
- 47.zip 函数如何把多个列表“打包”在一起?
- 48.如何给可迭代对象加上索引?
- 49.random 模块如何生成随机数?
- 50.math 模块怎么用?
- 51.Counter 如何快速统计元素出现次数?
如何用 Matplotlib 绘制散点图?
约 6 分钟
小象实战讲义 · Python 编程从入门到实践
散点图是数据可视化的基础图表之一,它能直观地展示两个变量之间的关系和数据的分布模式。在之前学过折线图(plot)和饼图之后,本节我们将学习如何使用 Matplotlib 的 scatter 函数绘制散点图,并理解其与折线图的区别。掌握散点图是后续进行数据分析探索的重要一步。
💡 核心导读
- 散点图的作用:将数据集中的每个数据点,用独立的点(如小圆点)绘制在二维坐标系中,用于观察数据的分布和变量间的关系。
- 核心函数:
matplotlib.pyplot.scatter(x, y),其中x和y分别是数据点的横、纵坐标序列。 - 关键参数:
s用于控制点的大小,alpha用于控制点的透明度,帮助我们优化图表呈现效果。 - 典型场景:展示非线性关系(如平方关系)或随机数据的分布(如正态分布)。
1. 散点图的基本绘制
散点图(Scatter Plot)的核心是将数据集中每个样本的 (x, y) 坐标对,用一个独立的标记(默认是圆点)绘制出来。这与折线图(plot)不同,折线图会按顺序连接点,形成连续的线条,而散点图更强调每个点的独立位置。
绘制散点图主要使用 matplotlib.pyplot.scatter(x, y) 函数。x 和 y 是两个长度相同的序列(如列表、元组或数组),分别提供了所有点的横坐标和纵坐标。
让我们看一个简单的例子,绘制函数 y = x² 的图像:
import matplotlib
matplotlib.use("Agg") # 无图形界面后端
import matplotlib.pyplot as plt
# 准备数据:x从0到99,y是x的平方
X = list(range(0, 100))
Y = [x**2 for x in X]
# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(X, Y)
# 设置坐标轴范围,以便更好地观察图形
plt.xlim(0, 100)
plt.ylim(0, 10000)
plt.close() # 关闭图形,在无头环境中释放资源执行后,图中会绘制 100 个散点:横坐标从 0 到 99,纵坐标为其平方值,所有点分布在一条开口向上的抛物线轨迹上。
与折线图的对比: 如果用 plot 函数绘制同样的数据,会得到一条连续的曲线。散点图则是在这条曲线的轨迹上,在每个整数 x 值处绘制了一个独立的点。plot 强调趋势和连续性,scatter 强调离散的数据点本身。
2. 散点图的典型应用:观察数据分布
散点图一个非常典型的应用是观察随机数据的分布情况。例如,我们可以生成两组服从正态分布(均值为0,标准差为1)的随机数,分别作为 x 和 y 坐标,来观察这些点在平面上的分布。
import matplotlib
matplotlib.use("Agg") # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np
# 固定随机种子,确保每次运行结果一致,便于学习对照
np.random.seed(42)
n = 512 # 点的数量
# 生成正态分布数据:均值0,标准差1
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
# 绘制散点图,并设置点的大小(s)和透明度(alpha)
plt.figure(figsize=(8, 8))
plt.scatter(X, Y, s=75, alpha=0.5)
# 将坐标系范围限制在 -1.5 到 1.5 之间
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.close()执行后,图中会绘制 512 个散点,大部分点密集地集中在坐标系中心 (0,0) 附近,越靠近边缘点越稀疏。这直观展示了正态分布数据“中间多,两头少”的特性。
为什么坐标范围是 -1.5 到 1.5? 对于均值为0、标准差为1的正态分布(标准正态分布),大约有68%的数据点落在 [-1, 1] 区间内,超过90%的数据点落在 [-2, 2] 区间内。因此,将坐标轴范围设为 [-1.5, 1.5] 可以清晰地展示出数据最集中的核心区域。如果将范围扩大到 [-5, 5],你会看到几乎所有点都聚集在图形中央的一小片区域,边缘非常空旷。
3. 散点图的可视化参数
scatter 函数提供了丰富的参数来调整点的外观,最常用的两个是:
s:控制点的大小(尺寸),是一个数值,所有点使用同一个尺寸。alpha:控制点的透明度,取值范围0.0(完全透明)到1.0(完全不透明)。当点非常密集时,降低透明度可以避免重叠点被完全遮盖,从而看出点的密度差异。
import matplotlib
matplotlib.use("Agg") # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(123) # 固定随机种子,保证每次运行的散点位置一致
# 生成少量数据以便观察参数效果
x = np.random.normal(0, 1, 20)
y = np.random.normal(0, 1, 20)
plt.figure(figsize=(6, 6))
# 点更大(s=150)、更透明(alpha=0.3)
plt.scatter(x, y, s=150, alpha=0.3)
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.close()执行后,点会明显变大且呈半透明;重叠区域颜色加深,能更直观地感受到点的分布密度。
📝 动手练一练
请尝试修改下面代码中的参数,观察散点图的变化。
- 将
s参数的值改为10和300,分别运行,观察点的大小变化。 - 将
alpha参数的值改为0.1和0.9,分别运行,观察点的透明度变化。
👉 点击查看参考答案
以下代码演示了 s 和 alpha 的修改方式,你可以依次替换参数值再运行对比:
import matplotlib
matplotlib.use("Agg") # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.normal(0, 1, 20)
y = np.random.normal(0, 1, 20)
plt.figure(figsize=(6, 6))
# 尝试把 s 改成 10 或 300,把 alpha 改成 0.1 或 0.9
plt.scatter(x, y, s=300, alpha=0.1)
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.close()思路:s 控制点的尺寸,数值越大点越大;alpha 控制整体透明度,数值越小越透明。
常见错误
| 错误写法 | 现象或报错 | 原因 | 正确写法 |
|---|---|---|---|
plt.scatter(x, y_list)其中 x 是数,y_list 是列表 | ValueError: x and y must be the same size | scatter 要求 x 和 y 是长度相同的序列。如果 x 是一个单独的数,它无法与 y 列表中的每个元素配对。 | plt.scatter([x]*len(y_list), y_list)或为每个 y 都准备对应的 x 值。 |
忘记 import matplotlib.pyplot as plt | NameError: name 'plt' is not defined | 直接使用 plt 别名,但未导入相应的模块。 | 在代码开头添加:import matplotlib.pyplot as plt |
使用 plot 函数但期望得到散点图 | 图形显示为连接的线条,而不是独立的点。 | plot 函数默认绘制连线。要绘制散点,应使用专门的 scatter 函数。 | 使用 plt.scatter(x, y)。 |
小结
- 核心函数:使用
matplotlib.pyplot.scatter(x, y)绘制散点图,x和y是等长的坐标序列。 - 与折线图的区别:散点图强调每个数据点的独立位置,适合展示分布和关系;折线图强调数据点间的顺序和趋势,适合展示变化。
- 观察数据分布:散点图能直观展示数据的聚集情况,例如正态分布的数据点会密集地集中在均值附近。
- 关键参数:
s:控制散点的大小。alpha:控制散点的透明度,有助于在点密集时观察重叠和密度。
- 坐标轴范围:使用
plt.xlim()和plt.ylim()可以调整视图范围,聚焦于数据的主要分布区域。
📋 行动清单
- 将第一个示例中的
scatter改为plot,运行并对比两者图形的差异。 - 在第二个正态分布示例中,将
plt.xlim和plt.ylim的参数改为(-5, 5),观察数据点在更大范围内的分布情况。 - 尝试在
scatter函数中组合使用s与alpha,创建一个视觉上更清晰的散点图。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第5章代码包:散点图(含1 个 Notebook)ZIP · 733B