查看全课大纲(第 43 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 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()

执行后,点会明显变大且呈半透明;重叠区域颜色加深,能更直观地感受到点的分布密度。

📝 动手练一练

请尝试修改下面代码中的参数,观察散点图的变化。

  1. 将 s 参数的值改为 10 和 300,分别运行,观察点的大小变化。
  2. 将 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 sizescatter 要求 x 和 y 是长度相同的序列。如果 x 是一个单独的数,它无法与 y 列表中的每个元素配对。plt.scatter([x]*len(y_list), y_list)
或为每个 y 都准备对应的 x 值。
忘记 import matplotlib.pyplot as pltNameError: name 'plt' is not defined直接使用 plt 别名,但未导入相应的模块。在代码开头添加:
import matplotlib.pyplot as plt
使用 plot 函数但期望得到散点图图形显示为连接的线条,而不是独立的点。plot 函数默认绘制连线。要绘制散点,应使用专门的 scatter 函数。使用 plt.scatter(x, y)。

小结

  1. 核心函数:使用 matplotlib.pyplot.scatter(x, y) 绘制散点图,x 和 y 是等长的坐标序列。
  2. 与折线图的区别:散点图强调每个数据点的独立位置,适合展示分布和关系;折线图强调数据点间的顺序和趋势,适合展示变化。
  3. 观察数据分布:散点图能直观展示数据的聚集情况,例如正态分布的数据点会密集地集中在均值附近。
  4. 关键参数:
    • s:控制散点的大小。
    • alpha:控制散点的透明度,有助于在点密集时观察重叠和密度。
  5. 坐标轴范围:使用 plt.xlim() 和 plt.ylim() 可以调整视图范围,聚焦于数据的主要分布区域。

📋 行动清单

  • 将第一个示例中的 scatter 改为 plot,运行并对比两者图形的差异。
  • 在第二个正态分布示例中,将 plt.xlim 和 plt.ylim 的参数改为 (-5, 5),观察数据点在更大范围内的分布情况。
  • 尝试在 scatter 函数中组合使用 s 与 alpha,创建一个视觉上更清晰的散点图。

—— 小象教研组

配套资料 · 直接下载

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

  • 第5章代码包:散点图(含1 个 Notebook)
    ZIP · 733B
    下载