Matplotlib 入门:为初学者准备的完整教程 – wiki基地


Matplotlib 入门:为初学者准备的完整教程

数据可视化是数据科学中至关重要的一步,它能帮助我们理解数据的分布、趋势和关系。在 Python 生态系统中,Matplotlib 是一个功能强大且广泛使用的绘图库。无论你是学生、研究员还是数据分析师,掌握 Matplotlib 都能极大地提升你的工作效率和数据洞察能力。

本教程旨在为完全没有 Matplotlib 经验的初学者提供一个全面、详细的入门指南。我们将从安装开始,逐步深入,讲解 Matplotlib 的基本概念、如何创建各种常用图表、以及如何对图表进行精细的定制,最终让你能够自信地使用 Matplotlib 进行数据可视化。

预计阅读时间: 约 25-35 分钟
目标读者: 对 Matplotlib 完全陌生的 Python 用户
先决条件: 熟悉 Python 基础语法

目录

  1. 引言:什么是 Matplotlib?

    • 数据可视化的重要性
    • Matplotlib 的定位和优势
    • Pyplot 简介
  2. 环境准备:安装 Matplotlib

    • 使用 pip 安装
    • 验证安装
  3. Matplotlib 的核心概念:Figure 和 Axes

    • Figure(画布)
    • Axes(坐标系/绘图区域)
    • 理解 Figure 和 Axes 的关系
  4. 初识 Matplotlib:第一个简单图表

    • 导入 Pyplot
    • 绘制直线图
    • 显示图表
    • 通过列表绘制数据
  5. 掌握基础图表类型

    • 直线图 (Line Plot): 绘制趋势
    • 散点图 (Scatter Plot): 展示数据点分布和关系
    • 柱状图 (Bar Plot): 比较类别数据
    • 直方图 (Histogram): 查看数据分布
  6. 图表元素的添加与定制

    • 添加标题 (Title)
    • 添加轴标签 (Labels)
    • 添加图例 (Legend)
    • 设置轴范围 (Limits)
    • 添加网格线 (Grid)
    • 添加文本注释 (Annotations)
  7. 图表外观的精细控制

    • 颜色 (Color)
    • 线型 (Line Style) 和线宽 (Line Width)
    • 标记 (Marker) 和标记大小 (Marker Size)
    • 透明度 (Alpha)
    • 使用内置样式 (Styles)
  8. 绘制多个子图 (Subplots)

    • 使用 plt.subplot()
    • 使用 plt.subplots()(推荐)
    • 在子图中绘制不同类型的图表
  9. 保存图表

    • plt.savefig() 函数
    • 指定文件格式和分辨率
  10. 一个综合示例:绘制更复杂的图表

    • 结合多种技术绘制一个包含多个元素的图表
  11. 总结与下一步

    • 回顾所学内容
    • 进一步学习资源和方向

1. 引言:什么是 Matplotlib?

数据可视化的重要性

在处理数据时,仅仅看到数字往往难以获得直观的认识。数据可视化是将数据转化为图形或图像的过程,它能帮助我们:

  • 发现趋势和模式: 一眼看出数据随时间的变化趋势、不同类别之间的差异。
  • 识别异常值: 图形中的离群点往往很容易被发现。
  • 传达洞察: 清晰的图表能够有效地向他人解释你的分析结果。
  • 验证假设: 通过可视化快速检查数据是否符合你的预期。

Matplotlib 的定位和优势

Matplotlib 是 Python 中最经典、最基础的绘图库。它提供了非常强大的控制能力,几乎可以定制图表的每一个细节。它的主要优势包括:

  • 功能强大: 能够生成各种静态、动态和交互式图表。
  • 高度可定制: 从字体、颜色到线型、标记,几乎所有元素都可以调整。
  • 广泛应用: 在科学计算、数据分析、机器学习等领域被广泛使用。
  • 丰富的生态系统: 与 NumPy、Pandas 等库紧密集成,也有 Seaborn、Plotly 等更高级的库基于 Matplotlib 构建或兼容。
  • 文档齐全: 官方文档详细且示例丰富(虽然有时对初学者来说可能显得庞大)。

Pyplot 简介

在 Matplotlib 中,最常用的模块是 matplotlib.pyplot。它提供了一个方便的、类似 MATLAB 的绘图接口,通过一系列函数调用来创建和定制图表。对于初学者来说,使用 pyplot 是一个很好的起点。我们通常会将其导入为 plt

python
import matplotlib.pyplot as plt

在本教程中,我们将主要使用 pyplot 接口,并适当地引入 Matplotlib 的面向对象接口,以便更好地理解图表的结构。

2. 环境准备:安装 Matplotlib

在开始之前,你需要确保你的 Python 环境已经安装了 Matplotlib。最常用的安装方式是使用 pip。

使用 pip 安装

打开你的终端或命令行,执行以下命令:

bash
pip install matplotlib

如果你使用的是 Anaconda 环境,也可以使用 conda 进行安装:

bash
conda install matplotlib

为了更好地支持中文显示和一些特殊字符,建议同时安装 fonttools

bash
pip install fonttools

安装过程可能需要一些时间,取决于你的网络状况。

验证安装

安装完成后,你可以通过简单的 Python 代码来验证 Matplotlib 是否成功安装:

python
import matplotlib
print(matplotlib.__version__)

如果成功打印出 Matplotlib 的版本号,说明安装成功。

3. Matplotlib 的核心概念:Figure 和 Axes

理解 Matplotlib 的 Figure 和 Axes 概念对于掌握如何构建和定制复杂图表至关重要。可以把它们想象成绘画过程中的两个关键元素。

Figure(画布)

Figure 对象是 Matplotlib 中的顶层容器,你可以理解为它是一个窗口或者一张画布,所有的图形元素(如坐标系、标题、图例等)都绘制在这个画布上。一个 Figure 可以包含一个或多个 Axes 对象。

你可以使用 plt.figure() 来创建一个 Figure 对象:

python
fig = plt.figure()

调用 plt.figure() 会创建一个新的空白画布。

Axes(坐标系/绘图区域)

Axes 对象是实际绘制数据的地方,它包含了 x 轴、y 轴、数据点、线条、标签、标题等。一个 Figure 可以包含多个 Axes,每个 Axes 都是一个独立的绘图区域。不要混淆 AxesAxis (Axis 指的是 x轴或 y轴本身)。

虽然你可以通过 fig.add_subplot() 方法向 Figure 中添加 Axes,但更常用且方便的方式是使用 plt.subplots() 函数。

理解 Figure 和 Axes 的关系

plt.subplots(nrows=1, ncols=1) 是一个非常常用的函数,它可以一步到位地创建一个 Figure 和一个或多个 Axes。

python
fig, ax = plt.subplots() # 创建一个 Figure 和一个 Axes

这个函数返回一个包含 Figure 对象和 Axes 对象(或 Axes 对象数组)的元组。当 nrowsncols 都为 1 时(这是默认值),ax 就是一个单个的 Axes 对象。如果 nrowsncols 大于 1,ax 将是一个 NumPy 数组,你需要通过索引来访问每个 Axes,例如 ax[0, 0]

为什么理解 Figure 和 Axes 很重要?

虽然 pyplot 提供了一些全局性的函数(如 plt.plot(), plt.title()),它们会自动作用于当前的 Figure 和 Axes。但在创建复杂图表或子图时,直接操作 Figure 和 Axes 对象(即使用面向对象的接口,如 ax.plot(), ax.set_title()) 会给你更多的控制权,并且代码会更清晰。对于初学者,先用 pyplot 入门,然后逐渐过渡到面向对象接口是一个不错的策略。我们将在后面的章节中结合使用这两种方式。

4. 初识 Matplotlib:第一个简单图表

让我们来绘制一个最简单的直线图。

导入 Pyplot

python
import matplotlib.pyplot as plt

绘制直线图

pyplotplot() 函数是最基础的绘图函数之一。它可以用来绘制线图或散点图。最简单的用法是给它传递一个列表或 NumPy 数组。Matplotlib 会默认将其作为 y 轴的值,而 x 轴的值则默认为这些数据的索引(从 0 开始)。

“`python

绘制一个简单的y值列表

plt.plot([1, 2, 3, 4])
“`

这里,x轴的值默认为 [0, 1, 2, 3],y轴的值为 [1, 2, 3, 4]。

如果你同时提供两个列表或数组,第一个将作为 x 轴的值,第二个作为 y 轴的值。

python
x = [1, 2, 3, 4]
y = [10, 8, 6, 4]
plt.plot(x, y)

显示图表

绘制命令(如 plt.plot())实际上只是在内存中创建或修改图表对象,并不会立即显示出来。你需要调用 plt.show() 函数来显示绘制的图表窗口。

“`python
import matplotlib.pyplot as plt

准备数据

x = [1, 2, 3, 4]
y = [10, 8, 6, 4]

绘制直线图

plt.plot(x, y)

显示图表

plt.show()
“`

运行这段代码,应该会弹出一个窗口显示一个简单的直线图。

通过 NumPy 数组绘制数据

在实际应用中,我们经常使用 NumPy 数组来存储和处理数据。Matplotlib 与 NumPy 集成得非常好。

“`python
import matplotlib.pyplot as plt
import numpy as np

创建 NumPy 数组数据

x = np.linspace(0, 10, 100) # 生成0到10之间100个等间隔的数
y = np.sin(x) # 计算这些数的正弦值

绘制正弦曲线

plt.plot(x, y)

显示图表

plt.show()
“`

这段代码将绘制一条平滑的正弦曲线。

5. 掌握基础图表类型

除了直线图,Matplotlib 还支持多种常用的图表类型。

直线图 (Line Plot)

前面已经介绍了 plt.plot() 的基本用法。它可以用来展示数据随某个连续变量(通常是时间)的变化趋势。

你可以绘制多条线在同一个 Axes 中:

“`python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label=’Sin(x)’) # 绘制第一条线,并加上标签
plt.plot(x, y2, label=’Cos(x)’) # 绘制第二条线,并加上标签

plt.xlabel(‘X Axis’) # 添加x轴标签
plt.ylabel(‘Y Axis’) # 添加y轴标签
plt.title(‘Sin and Cos Waves’) # 添加图表标题
plt.legend() # 显示图例

plt.show()
“`

散点图 (Scatter Plot)

散点图用于显示数据点之间的关系,通常用于观察两个变量之间的相关性。使用 plt.scatter() 函数。

“`python
import matplotlib.pyplot as plt
import numpy as np

生成一些随机数据

np.random.seed(0) # 固定随机种子以便复现
x = np.random.rand(50) * 10 # 50个0到10之间的随机数
y = np.random.rand(50) * 10 # 50个0到10之间的随机数
colors = np.random.rand(50) # 50个随机颜色值
sizes = np.random.rand(50) * 100 # 50个随机大小值

绘制散点图

plt.scatter(x, y, c=colors, s=sizes, alpha=0.7) # c参数控制颜色, s参数控制大小, alpha控制透明度

plt.xlabel(‘Random X’)
plt.ylabel(‘Random Y’)
plt.title(‘Scatter Plot with Random Data’)

plt.show()
“`

柱状图 (Bar Plot)

柱状图用于比较不同类别的数据。plt.bar() 用于绘制垂直柱状图,plt.barh() 用于绘制水平柱状图。

“`python
import matplotlib.pyplot as plt
import numpy as np

类别数据

categories = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]

对应的值

values = [23, 45, 56, 12, 30]

绘制垂直柱状图

plt.bar(categories, values, color=’skyblue’) # 可以指定颜色

plt.xlabel(‘Category’)
plt.ylabel(‘Value’)
plt.title(‘Bar Plot Example’)

plt.show()
“`

绘制水平柱状图:

“`python
import matplotlib.pyplot as plt

categories = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]
values = [23, 45, 56, 12, 30]

plt.barh(categories, values, color=’lightgreen’) # 使用 barh 绘制水平柱状图

plt.xlabel(‘Value’)
plt.ylabel(‘Category’) # 注意x轴和y轴标签的含义互换
plt.title(‘Horizontal Bar Plot Example’)

plt.show()
“`

直方图 (Histogram)

直方图用于显示数据集的分布。它将数据分成若干个区间(bins),然后统计每个区间内数据点的数量。使用 plt.hist() 函数。

“`python
import matplotlib.pyplot as plt
import numpy as np

生成一组服从正态分布的随机数据

data = np.random.randn(1000) # 1000个随机数,均值为0,方差为1

绘制直方图

bins参数指定直方图的柱子数量或边界

plt.hist(data, bins=30, color=’salmon’, edgecolor=’black’) # edgecolor给柱子加边框

plt.xlabel(‘Value’)
plt.ylabel(‘Frequency’)
plt.title(‘Histogram of Random Data’)

plt.show()
“`

6. 图表元素的添加与定制

一个好的图表不仅要展示数据,还需要清晰地说明数据代表什么。这通常通过添加标题、轴标签、图例等元素来实现。

无论是使用 pyplot 接口 (plt.XXX()) 还是面向对象接口 (ax.set_XXX()),这些功能都很容易实现。对于单个图表,两者效果类似,但面向对象接口在处理多个子图时更方便。我们将主要展示面向对象接口的使用。

我们通常从 plt.subplots() 开始获取 Figure 和 Axes 对象:

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots() # 创建一个 Figure 和一个 Axes

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax.plot(x, y) # 使用 Axes 对象进行绘图

添加标题

ax.set_title(‘Sin Curve’)

添加轴标签

ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)

显示图表

plt.show()
“`

添加标题 (Title)

  • pyplot 接口:plt.title('Your Title')
  • 面向对象接口:ax.set_title('Your Title')

添加轴标签 (Labels)

  • pyplot 接口:plt.xlabel('X-axis Label'), plt.ylabel('Y-axis Label')
  • 面向对象接口:ax.set_xlabel('X-axis Label'), ax.set_ylabel('Y-axis Label')

添加图例 (Legend)

当你在同一个 Axes 中绘制多条线或多个数据系列时,图例可以帮助区分它们。你需要在使用 plot()scatter() 等函数时,通过 label 参数为每个数据系列指定一个名称。然后调用 plt.legend()ax.legend() 来显示图例。

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

ax.plot(x, y1, label=’Sin(x)’) # 添加 label
ax.plot(x, y2, label=’Cos(x)’) # 添加 label

ax.set_title(‘Sin and Cos Waves with Legend’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.legend() # 显示图例

plt.show()
“`

设置轴范围 (Limits)

你可以使用 plt.xlim()plt.ylim()ax.set_xlim()ax.set_ylim() 来手动设置 x 轴和 y 轴的显示范围。

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax.plot(x, y)

ax.set_title(‘Sin Curve with Custom Limits’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)

ax.set_xlim(0, 5) # 设置x轴范围从0到5
ax.set_ylim(-1.5, 1.5) # 设置y轴范围从-1.5到1.5

plt.show()
“`

添加网格线 (Grid)

网格线可以帮助读者更容易地读取图表中的数值。

  • pyplot 接口:plt.grid(True)
  • 面向对象接口:ax.grid(True)

你还可以定制网格线的样式(如颜色、线型)。

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax.plot(x, y)

ax.set_title(‘Sin Curve with Grid’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.grid(True, linestyle=’–‘, alpha=0.6) # 添加网格线,设置为虚线,半透明

plt.show()
“`

添加文本注释 (Annotations)

你可以在图表的任意位置添加文本说明,或者用箭头指向图表中的特定点。plt.text()ax.text() 用于添加文本,plt.annotate()ax.annotate() 用于添加带箭头的注释。

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax.plot(x, y)

ax.set_title(‘Sin Curve with Annotation’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)

添加一个简单的文本注释

ax.text(7, 0.5, ‘Peak Value’, fontsize=10, color=’red’)

添加一个带箭头的注释,指向正弦曲线的第一个峰值

ax.annotate(‘First Peak’, xy=(np.pi/2, 1), xytext=(5, 1.2),
arrowprops=dict(facecolor=’black’, shrink=0.05))

plt.show()
``xy是要注释的点,xytext是文本放置的位置,arrowprops` 用于定制箭头的样式。

7. 图表外观的精细控制

Matplotlib 提供了丰富的选项来控制图表的颜色、线型、标记等外观属性,让你的图表更具表现力和专业性。这些选项通常作为参数传递给绘图函数(如 plot, scatter, bar, hist)。

颜色 (Color)

可以通过多种方式指定颜色:

  • 颜色缩写: ‘b’ (蓝色), ‘g’ (绿色), ‘r’ (红色), ‘c’ (青色), ‘m’ (品红), ‘y’ (黄色), ‘k’ (黑色), ‘w’ (白色)
  • 全称: ‘blue’, ‘green’, ‘red’, ‘cyan’, ‘magenta’, ‘yellow’, ‘black’, ‘white’
  • 十六进制字符串: ‘#EE6666’
  • RGB 元组: (0.1, 0.2, 0.5) 值范围在 0 到 1 之间
  • 灰度字符串: 例如 ‘0.8’ (表示 80% 的灰度)

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

ax.plot(x, y1, color=’green’, label=’Sin(x)’) # 使用颜色名称
ax.plot(x, y2, color=’#FF7F0E’, label=’Cos(x)’) # 使用十六进制码

ax.legend()
ax.set_title(‘Custom Colors’)
plt.show()
“`

线型 (Line Style) 和线宽 (Line Width)

用于 plot 函数控制线的样式和粗细:

  • linestyle (或简写 ls): ‘-‘ (实线), ‘–‘ (虚线), ‘-.’ (点划线), ‘:’ (点线), ‘None’ (无线条)
  • linewidth (或简写 lw): 设置线的粗细,通常为浮点数

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.cos(x)

ax.plot(x, y1, linestyle=’-‘, lw=1, label=’Solid’)
ax.plot(x, y2, ls=’–‘, lw=2, label=’Dashed’)
ax.plot(x, y3, ls=’:’, lw=3, label=’Dotted’)

ax.legend()
ax.set_title(‘Custom Line Styles and Widths’)
plt.show()
“`

标记 (Marker) 和标记大小 (Marker Size)

用于在数据点位置添加标记,特别是在散点图或点状线图中:

  • marker: 设置标记的样式,如 ‘o’ (圆圈), ‘x’ (叉号), ‘s’ (正方形), ‘^’ (三角形), ‘.’ (点) 等
  • markersize (或简写 ms): 设置标记的大小
  • markeredgecolor (或简写 mec): 设置标记的边缘颜色
  • markerfacecolor (或简写 mfc): 设置标记的填充颜色

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 10) # 使用较少的数据点以便看到标记
y = np.sin(x)

ax.plot(x, y, marker=’o’, ms=8, mec=’blue’, mfc=’lightblue’, linestyle=’–‘)

ax.set_title(‘Line Plot with Markers’)
plt.show()
“`

对于 scatter 函数,s 参数用于控制标记大小,c 参数控制颜色。

“`python
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
x = np.random.rand(50) * 10
y = np.random.rand(50) * 10
sizes = np.random.rand(50) * 200 + 50 # 50到250之间的大小
colors = np.random.rand(50) # 随机颜色

fig, ax = plt.subplots()
ax.scatter(x, y, s=sizes, c=colors, alpha=0.8, cmap=’viridis’, edgecolors=’w’) # cmap指定颜色映射,edgecolors指定边缘颜色

ax.set_title(‘Scatter Plot with Variable Size and Color’)
plt.show()
“`

透明度 (Alpha)

alpha 参数用于设置图表元素的透明度,值范围在 0 (完全透明) 到 1 (完全不透明) 之间。这在数据点密集时很有用,可以帮助看出重叠区域。

“`python
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)

fig, ax = plt.subplots()

ax.scatter(x, y, alpha=0.3) # 设置透明度为 0.3

ax.set_title(‘Scatter Plot with Alpha’)
plt.show()
“`

使用内置样式 (Styles)

Matplotlib 提供了很多内置的样式,可以快速改变图表的整体外观风格。你可以通过 plt.style.use() 函数来应用这些样式。

要查看所有可用的样式:

python
print(plt.style.available)

常用的样式包括 ‘seaborn-v0_8’, ‘ggplot’, ‘fivethirtyeight’, ‘classic’, ‘dark_background’ 等。

“`python
import matplotlib.pyplot as plt
import numpy as np

应用 ‘ggplot’ 样式

plt.style.use(‘ggplot’)

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax.plot(x, y)

ax.set_title(‘Sin Curve with ggplot Style’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)

plt.show()
“`

请注意,plt.style.use() 会影响它之后创建的所有图表,直到你使用 plt.style.use('default') 或其他样式来覆盖它。

8. 绘制多个子图 (Subplots)

有时我们需要在一个 Figure 中展示多个相关的图表,以便于比较。Matplotlib 提供了创建子图的功能。

使用 plt.subplot()

plt.subplot(nrows, ncols, index) 函数可以在一个 Figure 中创建一个 Axes。nrowsncols 分别指定子图的行数和列数,index 指定当前 Axes 的位置(从左上角开始,按行计数,从 1 开始)。

“`python
import matplotlib.pyplot as plt
import numpy as np

创建一个 Figure

plt.figure(figsize=(10, 5)) # 可以指定 Figure 的大小 (宽, 高) 英寸

创建第一个子图 (1行2列,第一个)

plt.subplot(1, 2, 1)
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
plt.plot(x, y1)
plt.title(‘Sin(x)’)

创建第二个子图 (1行2列,第二个)

plt.subplot(1, 2, 2)
y2 = np.cos(x)
plt.plot(x, y2, color=’orange’)
plt.title(‘Cos(x)’)

自动调整子图之间的间距,避免重叠

plt.tight_layout()

plt.show()
“`

这种方式对于简单的子图布局很直观,但当子图数量多或布局复杂时,管理起来可能不太方便,尤其是在使用面向对象接口时。

使用 plt.subplots()(推荐)

前面提到过的 plt.subplots(nrows, ncols) 函数是创建子图的更现代和推荐的方式。它直接返回 Figure 和 Axes 对象(或 Axes 对象的 NumPy 数组),你可以直接操作这些 Axes 对象进行绘图。

“`python
import matplotlib.pyplot as plt
import numpy as np

创建一个 2行2列 的子图布局

fig 是 Figure 对象

axs 是一个 2×2 的 NumPy 数组,包含了所有的 Axes 对象

fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))

在左上角子图绘图 (axs[0, 0])

x = np.linspace(0, 10, 100)
axs[0, 0].plot(x, np.sin(x), color=’blue’)
axs[0, 0].set_title(‘Sin(x)’)

在右上角子图绘图 (axs[0, 1])

axs[0, 1].plot(x, np.cos(x), color=’red’)
axs[0, 1].set_title(‘Cos(x)’)

在左下角子图绘图 (axs[1, 0])

axs[1, 0].scatter(np.random.rand(50), np.random.rand(50))
axs[1, 0].set_title(‘Random Scatter’)

在右下角子图绘图 (axs[1, 1])

data = np.random.randn(100)
axs[1, 1].hist(data, bins=20)
axs[1, 1].set_title(‘Random Histogram’)

添加 Figure 的总标题

fig.suptitle(‘Four Different Plots’, fontsize=16)

自动调整子图间距

plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # rect参数可以为suptitle留出空间

plt.show()
“`

使用 plt.subplots() 返回的 axs 数组来操作每个子图的 Axes 对象,是更清晰、更灵活的方式,尤其是在你需要对每个子图进行独立的定制时。

9. 保存图表

当你完成图表的绘制和定制后,通常需要将其保存到文件中,而不是只在屏幕上显示。使用 plt.savefig() 函数可以轻松实现这一点。

“`python
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(8, 6))

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax.plot(x, y)
ax.set_title(‘Sin Curve’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)

保存图表到文件

文件名 ‘sin_curve.png’

dpi 参数控制分辨率,越高越清晰

bbox_inches=’tight’ 尝试去除图表周围多余的空白

plt.savefig(‘sin_curve.png’, dpi=300, bbox_inches=’tight’)

如果需要显示图表,仍然需要调用 show()

plt.show()

print(“图表已保存为 sin_curve.png”)
“`

savefig() 函数的常用参数:

  • fname: 文件名或文件路径。文件扩展名(如 .png, .jpg, .pdf, .svg)决定了保存的格式。
  • dpi: Dots per inch,控制图像分辨率。对于打印或高质量显示很重要。
  • format: 明确指定文件格式(可选,通常根据文件名推断)。
  • bbox_inches: ‘tight’ 可以尝试移除图表周围的空白区域,避免轴标签或标题被裁切。
  • transparent: True 可以将图表背景设置为透明(适用于 PNG 和 SVG 等格式)。

你可以保存为多种格式,例如:

  • plt.savefig('my_plot.png') (PNG 格式,位图)
  • plt.savefig('my_plot.jpg') (JPEG 格式,位图)
  • plt.savefig('my_plot.pdf') (PDF 格式,矢量图,推荐用于出版)
  • plt.savefig('my_plot.svg') (SVG 格式,矢量图,推荐用于网页或矢量编辑)

矢量图格式(如 PDF, SVG)在放大时不会失真,通常更适合出版和高质量输出。

10. 一个综合示例:绘制更复杂的图表

让我们结合前面学到的知识,创建一个稍微复杂一些的图表,包含多个数据系列、定制外观和图例等。

假设我们有一些关于不同城市每月平均温度的数据。

“`python
import matplotlib.pyplot as plt
import numpy as np

模拟一些数据

months = [‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’, ‘Jun’,
‘Jul’, ‘Aug’, ‘Sep’, ‘Oct’, ‘Nov’, ‘Dec’]

城市A的平均温度 (模拟)

temp_city_a = np.array([5, 6, 10, 15, 20, 25, 28, 27, 22, 16, 10, 6])

城市B的平均温度 (模拟)

temp_city_b = np.array([2, 4, 8, 13, 18, 23, 26, 25, 20, 14, 8, 4])

设置图表样式 (可选)

plt.style.use(‘seaborn-v0_8-darkgrid’) # 使用 seaborn 风格

创建 Figure 和 Axes 对象

fig, ax = plt.subplots(figsize=(10, 6)) # 指定 Figure 大小

绘制城市A的温度曲线,带标记

ax.plot(months, temp_city_a, marker=’o’, linestyle=’-‘, color=’steelblue’, label=’City A’)

绘制城市B的温度曲线,使用不同的样式

ax.plot(months, temp_city_b, marker=’x’, linestyle=’–‘, color=’indianred’, label=’City B’)

添加标题和轴标签

ax.set_title(‘Monthly Average Temperature Comparison’, fontsize=16)
ax.set_xlabel(‘Month’, fontsize=12)
ax.set_ylabel(‘Temperature (°C)’, fontsize=12)

添加图例

ax.legend(loc=’upper left’, fontsize=10) # 指定图例位置和字体大小

设置 y 轴范围

ax.set_ylim(0, 35) # 留出一些空间

添加网格线 (样式已经在 style 中定义,这里如果想自定义可以再次调用)

ax.grid(True, linestyle=’:’, alpha=0.6)

在某个点添加文本注释 (例如,城市A的最高温度)

max_temp_a = temp_city_a.max()
max_month_a_index = temp_city_a.argmax()
ax.text(max_month_a_index, max_temp_a + 1, f'{max_temp_a}°C’,
horizontalalignment=’center’, color=’steelblue’, fontsize=10)

在某个点添加文本注释 (例如,城市B的最高温度)

max_temp_b = temp_city_b.max()
max_month_b_index = temp_city_b.argmax()
ax.text(max_month_b_index, max_temp_b + 1, f'{max_temp_b}°C’,
horizontalalignment=’center’, color=’indianred’, fontsize=10)

自动调整布局

fig.tight_layout()

保存图表

plt.savefig(‘temperature_comparison.png’, dpi=300)

显示图表

plt.show()
“`

这段代码展示了如何:
* 导入必要的库。
* 准备数据(使用列表和 NumPy 数组)。
* 应用 Matplotlib 样式。
* 创建 Figure 和 Axes。
* 在 Axes 上绘制多条线,并使用不同的颜色、线型和标记。
* 添加标题、轴标签和图例。
* 设置轴的范围。
* 添加文本注释来突出重要数值。
* 使用 tight_layout() 调整子图间距。
* 保存图表到文件。
* 显示图表。

这是一个相对完整的例子,涵盖了本教程中的大部分基础知识。

11. 总结与下一步

恭喜你!你已经完成了 Matplotlib 的入门学习。在本教程中,我们学习了:

  • 什么是 Matplotlib 及其在数据可视化中的作用。
  • 如何安装 Matplotlib。
  • Matplotlib 的核心概念 Figure 和 Axes。
  • 如何使用 pyplot 和面向对象接口创建简单的图表。
  • 绘制直线图、散点图、柱状图和直方图。
  • 为图表添加标题、轴标签、图例、网格线和文本注释。
  • 精细定制图表的颜色、线型、标记等外观属性。
  • 创建和管理多个子图。
  • 将图表保存到文件。
  • 通过一个综合示例巩固所学知识。

这只是 Matplotlib 功能的冰山一角。Matplotlib 还有很多更高级和专业的特性,例如:

  • 绘制更复杂的图表类型(如饼图、箱线图、等高线图等)。
  • 处理日期和时间数据。
  • 创建 3D 图表。
  • 制作动画和交互式图表。
  • 更高级的布局控制(如 GridSpec)。
  • 自定义字体、刻度、颜色映射等。

进一步学习资源和方向:

  • Matplotlib 官方文档: 这是最权威的资料来源,虽然内容庞大,但通过搜索特定函数或示例是学习的好方法。
  • Matplotlib 示例库: 官方网站上的示例非常丰富,很多时候找到一个类似的示例代码,在其基础上修改,是学习和解决问题的有效途径。
  • Seaborn 库: Seaborn 是基于 Matplotlib 的高级统计数据可视化库,提供了更美观的默认样式和更方便的高级图表类型函数,与 Pandas 集成更好。在掌握 Matplotlib 基础后,学习 Seaborn 会让你事半功倍。
  • 其他可视化库: Plotly (交互式图表)、Bokeh (交互式图表)、Altair (声明式可视化) 等也是值得了解的 Python 可视化库。

持续练习是掌握 Matplotlib 的关键。尝试用 Matplotlib 绘制你自己的数据,多参考官方示例和文档,你会越来越熟练地使用这个强大的工具。

希望这篇详细的教程为你打开了 Matplotlib 的大门,祝你在数据可视化的旅程中取得成功!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部