Python Matplotlib 画图是什么?核心概念与能力

Python Matplotlib 是一个用于创建静态、动态和交互式可视化图表的综合库。它是 Python 数据可视化领域的基础工具之一,以其强大的功能和极高的定制性而闻名。

Matplotlib 的本质

  • 基础绘图库: Matplotlib 是一个低级(low-level)绘图库,这意味着它提供了非常精细的控制,允许开发者几乎可以调整图表中的每一个元素。许多其他高级可视化库,如 Seaborn 和 Pandas 的内置绘图功能,都是建立在 Matplotlib 之上的。
  • 面向对象设计: Matplotlib 的核心是一个面向对象的 API,尽管它也提供了一个名为 `pyplot` 的模块,提供了 MATLAB 风格的函数式接口,方便快速绘图。

核心组件

理解 Matplotlib 的核心组件对于高效使用它至关重要:

  1. Figure(画布/图形):

    Figure 是所有图表元素的顶层容器。它就像一个白板或者一张纸,你可以在上面绘制一个或多个图表。一个 Figure 可以包含一个或多个 Axes。当你调用 `plt.figure()` 时,你就是在创建一个 Figure 对象。

  2. Axes(坐标轴/子图):

    Axes 是你实际绘制数据的地方。它包含了 x 轴、y 轴、刻度线、标签、标题以及所有绘制在图表上的数据元素(如线、点、柱状图等)。一个 Figure 可以包含多个 Axes,每个 Axes 都是一个独立的绘图区域。在 `pyplot` 接口中,`plt.plot()` 等函数默认会在当前的 Axes 上进行操作;在面向对象接口中,你会直接操作 `Axes` 对象。

  3. Artist(艺术家):

    Artist 是 Figure 上所有可见元素的基类,包括 Figure、Axes、Line2D、Text、patches 等。每一个绘制在 Figure 上的对象都是一个 Artist。当你设置标题、轴标签、刻度线时,你实际上是在操作不同的 Artist 对象。

它能绘制哪些图表类型?

Matplotlib 的强大之处在于其能够生成几乎任何类型的 2D 和一些 3D 图表。常见的图表类型包括:

  • 基础 2D 图表:

    • 线图 (Line Plot): `plt.plot()`,用于展示数据随连续变量的变化趋势。
    • 散点图 (Scatter Plot): `plt.scatter()`,用于展示两个变量之间的关系或数据点的分布。
    • 柱状图 (Bar Chart): `plt.bar()` / `plt.barh()`,用于比较不同类别的数据。
    • 直方图 (Histogram): `plt.hist()`,用于展示数据分布的频率。
    • 饼图 (Pie Chart): `plt.pie()`,用于展示各部分在整体中所占的比例。
    • 箱线图 (Box Plot): `plt.boxplot()`,用于展示数据的分布和异常值。
    • 小提琴图 (Violin Plot): `plt.violinplot()`,类似于箱线图,但能更详细地展示数据分布的密度。
    • 等高线图 (Contour Plot): `plt.contour()` / `plt.contourf()`,用于展示三维函数在二维平面上的等值线。
    • 热力图 (Heatmap): `plt.imshow()` / `plt.pcolormesh()`,用于以颜色强度展示二维数据的分布。
    • 误差棒图 (Errorbar Plot): `plt.errorbar()`,用于展示数据的误差或不确定性。
    • 矢量场图 (Quiver Plot): `plt.quiver()`,用于展示向量场。
    • 流线图 (Streamplot): `plt.streamplot()`,用于展示二维矢量场的流线。
  • 3D 图表: (需要导入 `mpl_toolkits.mplot3d`)

    • 三维散点图: `ax.scatter(X, Y, Z)`
    • 三维曲面图: `ax.plot_surface(X, Y, Z)`
    • 三维线框图: `ax.plot_wireframe(X, Y, Z)`
    • 三维等高线图: `ax.contour3D(X, Y, Z)`
    • 三维柱状图: `ax.bar3d()`

为什么选择 Matplotlib?其价值与优势

在众多的数据可视化库中,Matplotlib 依然是 Python 生态系统中不可或缺的一员。它的选择理由通常基于以下几个核心优势:

无与伦比的控制力与定制性

Matplotlib 允许你对图表中的每一个像素进行控制。从线条的粗细、颜色、样式,到文字的字体、大小、位置,再到图例、坐标轴、刻度线的每一个细节,你都可以进行精细调整。这种级别的控制力在需要创建高度定制化、符合特定发布标准或品牌指南的图表时尤为重要。

例如,你可以精确调整图例的位置,改变某个特定文本的旋转角度,甚至为图表的不同区域设置不同的背景颜色。这种灵活性使得 Matplotlib 成为科研论文、报告和专业出版物中生成高质量图表的首选工具。

广泛的社区支持与稳定性

Matplotlib 拥有悠久的历史和庞大的用户基础,这意味着:

  • 丰富的文档和教程: 官方文档详尽,并且有大量的在线教程、书籍和博客文章可以作为学习资源。
  • 活跃的社区: 在 Stack Overflow、GitHub 等平台上,你可以轻松找到问题的答案或寻求帮助。
  • 稳定性和成熟度: 作为一个成熟的库,它的 API 相对稳定,且经过了广泛的测试和使用,bug 较少。

强大的输出能力

Matplotlib 可以将图表输出为多种高质量的格式,满足不同的需求:

  • 位图格式 (Raster Graphics): 如 PNG, JPG, TIFF。这些格式适用于网页、PPT 展示,但放大后可能会失真。
  • 矢量图格式 (Vector Graphics): 如 SVG, PDF, EPS。这些格式的图表在放大时不会失真,非常适合用于学术论文、印刷品或需要无限缩放的场合。

其输出质量通常达到出版级别,这也是科研工作者和数据分析师青睐它的重要原因。

作为其他库的基础

理解 Matplotlib 不仅仅是为了直接使用它,更是为了更好地理解和利用建立在其之上的其他高级库。

  • Seaborn: Seaborn 是一个基于 Matplotlib 的高级统计图形库,它提供了一个更简洁的 API 来绘制美观且具有统计学意义的图表。但 Seaborn 图表的底层渲染依然由 Matplotlib 完成,因此,了解 Matplotlib 可以让你对 Seaborn 图表进行更深层次的定制。
  • Pandas 绘图: Pandas DataFrame 和 Series 对象都内置了 `.plot()` 方法,这些方法实际上是 Matplotlib 的一个便捷封装。当你在 Pandas 中调用 `.plot()` 时,你就是在间接使用 Matplotlib。如果你想定制 Pandas 绘图的细节,你仍然需要 Matplotlib 的知识。

因此,掌握 Matplotlib 就像掌握了绘图的“母语”,能够让你在 Python 数据可视化领域游刃有余。

Matplotlib 在哪里被使用?应用场景与输出方式

Matplotlib 的灵活性使其能够在多种环境中发挥作用,并支持将图表输出到不同的目的地和格式。

Matplotlib 的使用环境

  • Python 脚本 (Script):

    最常见的用法。你可以在 `.py` 文件中编写代码来生成图表,并在脚本执行结束时显示或保存图表。这适用于自动化报告、数据分析流程的集成。

    
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0, 10, 100)
    y = np.sin(x)
    plt.plot(x, y)
    plt.title("Sine Wave")
    plt.show() # 在桌面显示窗口
    # plt.savefig('sine_wave.png') # 保存为图片文件
            
  • Jupyter Notebook / IPython 环境:

    这是数据科学家和分析师最常使用的环境。在 Jupyter Notebook 或 IPython Shell 中,图表可以直接嵌入在输出单元格中,实现交互式探索和即时可视化。

    
    # 在 Jupyter Notebook 中通常需要这一行来确保图表内联显示
    # %matplotlib inline 
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0, 10, 100)
    y = np.cos(x)
    plt.plot(x, y)
    plt.title("Cosine Wave in Jupyter")
    plt.show() # 在单元格下方显示图表
            
  • 桌面 GUI 应用程序:

    Matplotlib 可以集成到各种桌面图形用户界面 (GUI) 工具包中,如 Tkinter、PyQt、WxPython、GTK 等。这使得开发者可以在自定义的桌面应用中嵌入动态的、交互式的图表。

    
    # 伪代码示例:将 Matplotlib 图表嵌入 PyQt 应用
    # from PyQt5 import QtWidgets
    # from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    # from matplotlib.figure import Figure
    #
    # class MyWidget(QtWidgets.QWidget):
    #     def __init__(self, parent=None):
    #         super().__init__(parent)
    #         self.figure = Figure()
    #         self.canvas = FigureCanvas(self.figure)
    #         self.ax = self.figure.add_subplot(111)
    #         self.ax.plot([0,1,2],[1,0,3])
    #         # ...布局代码...
            
  • Web 应用程序:

    虽然 Matplotlib 本身不是为 Web 交互式绘图而设计的,但它可以通过将图表渲染成图片(如 PNG、SVG)并将其嵌入 HTML 页面来在 Web 应用中使用。这在基于 Flask、Django 等框架构建的数据仪表板或报告系统中很常见。

    
    # 伪代码示例:在 Flask 中生成并返回图片
    # from flask import Flask, send_file
    # import matplotlib.pyplot as plt
    # import io
    #
    # app = Flask(__name__)
    #
    # @app.route('/plot.png')
    # def plot_png():
    #     fig, ax = plt.subplots()
    #     ax.plot([0,1,2], [1,0,3])
    #     ax.set_title("Web Plot")
    #     buf = io.BytesIO()
    #     fig.savefig(buf, format='png')
    #     buf.seek(0)
    #     return send_file(buf, mimetype='image/png')
    #
    # if __name__ == '__main__':
    #     app.run(debug=True)
            

图表的输出目的地与格式

无论在哪种环境中使用,最终的图表都可以被显示在屏幕上,或者保存到文件中。

  1. 屏幕显示 (Display):

    通过 `plt.show()` 函数,Matplotlib 会打开一个图形窗口来显示当前绘制的图表。在 Jupyter Notebook 等交互式环境中,`plt.show()` 或 `%matplotlib inline` / `%matplotlib notebook` 魔术命令会将图表直接渲染到输出单元格中。

  2. 保存到文件 (Save to File):

    使用 `fig.savefig()` 方法可以将图表保存为多种文件格式。这是在不需要交互式显示,或需要将图表用于报告、演示文稿或网页时的主要方式。

    
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    ax.plot([1, 2, 3], [4, 5, 6])
    ax.set_title("Saved Plot")
    
    # 保存为 PNG 格式,分辨率 300 DPI
    fig.savefig('my_plot.png', dpi=300) 
    print("图表已保存为 my_plot.png")
    
    # 保存为 SVG 格式 (矢量图)
    fig.savefig('my_plot.svg')
    print("图表已保存为 my_plot.svg")
    
    # 保存为 PDF 格式 (矢量图)
    fig.savefig('my_plot.pdf')
    print("图表已保存为 my_plot.pdf")
    
    # 保存为 JPEG 格式
    fig.savefig('my_plot.jpg', quality=95) # quality 参数控制 JPEG 质量
    
    # 保存为 EPS 格式
    fig.savefig('my_plot.eps')
            

    常用的文件格式包括:

    • PNG (Portable Network Graphics): 最常见的无损位图格式,适用于网页和文档。
    • JPG/JPEG (Joint Photographic Experts Group): 有损压缩位图格式,文件大小较小,适用于照片。
    • SVG (Scalable Vector Graphics): 矢量图格式,在任何放大倍数下都不会失真,适用于网页和高质量印刷。
    • PDF (Portable Document Format): 矢量图格式,广泛用于文档和印刷。
    • EPS (Encapsulated PostScript): 矢量图格式,在学术出版领域常用。
    • TIFF (Tagged Image File Format): 高质量无损位图格式,常用于印刷和专业图像处理。
    • WebP: Google 开发的新一代图像格式,支持有损和无损压缩。

Matplotlib 可以做什么?绘制图表数量与数据处理能力

Matplotlib 在数据可视化方面的能力体现在它能够绘制的图表种类之多,以及它处理不同规模数据时的表现。

图表类型的丰富性

如前面“是什么”部分所述,Matplotlib 能够绘制的图表类型非常广泛。这不仅仅局限于前面列举的那些,更重要的是,它提供了构建这些图表的基础“积木”,让你能够组合和修改它们来创建高度专业化甚至全新的可视化形式。

  • 组合图表: 可以在同一个 Axes 上叠加不同类型的图表(如线图和散点图),或使用多个 Axes 在一个 Figure 中创建复杂的布局(如多子图、嵌套子图)。
  • 自定义元素: 几乎所有图表元素(如标题、标签、图例、颜色、线型、标记、文本注释、箭头、形状等)都可以被定制,以适应特定的数据故事或美学要求。
  • 特殊可视化: 即使是一些不常见的可视化需求,Matplotlib 也能通过其灵活的 API 和各种 Artist 对象来满足,例如自定义的坐标系、非线性变换等。

数据规模的处理能力

Matplotlib 能够处理的数据规模范围非常广泛,从几十个数据点到数百万甚至上千万的数据点。

  • 小到中等规模数据:

    对于常见的数据分析任务,例如处理几千到几十万行的数据集,Matplotlib 能够非常高效地绘制图表。其性能瓶颈通常不是库本身,而是数据的读取、处理速度以及计算机的内存和CPU。

  • 大规模数据:

    当数据量达到百万甚至千万级别时,Matplotlib 仍然可以工作,但可能需要注意以下几点:

    1. 性能优化:

      绘制大量数据点可能会导致渲染时间变长,尤其是对于复杂的图表类型。在这种情况下,可以考虑:

      • 数据抽样 (Sampling): 在不影响整体趋势的情况下,对数据进行抽样,减少需要绘制的点数。
      • 数据聚合 (Aggregation): 对数据进行分组或计算统计量(如均值、中位数),绘制聚合后的结果而非所有原始数据点。
      • 使用 `plt.plot()` 的优化: `plt.plot()` 在绘制大量数据点时通常比 `plt.scatter()` 更快,因为它通常将点视为一条连续的线。
      • 开启抗锯齿 (Anti-aliasing) 优化: 某些后端可以优化渲染。
    2. 内存消耗:

      加载和处理大量数据本身就会消耗大量内存。确保你的系统有足够的 RAM 来处理这些数据。

    3. 交互性:

      对于非常大的数据集,交互式操作(如缩放、平移)可能会变得迟钝。在这种情况下,可能需要考虑专门为大数据集设计的交互式可视化库(如 Bokeh、Plotly),或者在后端进行数据预处理。

总的来说,Matplotlib 在处理绝大多数常见的数据可视化需求时都表现出色。它提供了强大的工具集,无论数据规模大小,都能帮助用户有效地探索和呈现数据。

如何使用 Matplotlib?从入门到高级实践

学习 Matplotlib 的最佳方式是动手实践。以下将从安装到基本绘图,再到高级定制和应用,详细讲解其使用方法。

1. 安装 Matplotlib

Matplotlib 可以通过 Python 的包管理工具 `pip` 轻松安装。通常,你还会希望安装 NumPy 和 Pandas,它们是数据处理的常用库。


pip install matplotlib numpy pandas

2. 基本绘图流程 (Pyplot 接口)

`matplotlib.pyplot` 模块提供了一个类似 MATLAB 的函数式接口,适合快速创建图表。


import matplotlib.pyplot as plt
import numpy as np

# 1. 准备数据
x = np.linspace(0, 10, 100) # 生成 0 到 10 之间均匀分布的 100 个点
y1 = np.sin(x)
y2 = np.cos(x) * 0.5 + 2

# 2. 绘制图表
# plt.plot(x, y) 函数用于绘制线图
# 可以指定颜色(color)、线型(linestyle)、标记(marker)等
plt.plot(x, y1, color='blue', linestyle='-', label='Sine Wave')
plt.plot(x, y2, color='red', linestyle='--', marker='o', markersize=4, label='Cosine Wave')

# 3. 添加图表元素 (定制化)
plt.xlabel('X轴标签') # 设置X轴标签
plt.ylabel('Y轴标签') # 设置Y轴标签
plt.title('一个简单的Matplotlib线图') # 设置图表标题
plt.legend() # 显示图例 (需要 plt.plot 中设置 label)
plt.grid(True) # 显示网格线

# 4. 显示图表
plt.show()

这段代码会生成一个包含两条曲线、带有标题、轴标签、图例和网格线的图表,并在一个新窗口中显示。

3. 面向对象接口的优势

对于更复杂的图表或需要更精细控制的场景,推荐使用面向对象接口。它通过创建 Figure 和 Axes 对象,然后对这些对象进行操作。


import matplotlib.pyplot as plt
import numpy as np

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

# 创建一个 Figure 对象和一个 Axes 对象 (1行1列的子图)
# fig 是 Figure 对象,ax 是 Axes 对象
fig, ax = plt.subplots(figsize=(8, 5)) # 可以指定图表大小

# 在 Axes 对象上绘制数据
ax.plot(x, y1, label='Sine', color='green')
ax.plot(x, y2, label='Cosine', color='purple', linestyle=':')

# 通过 Axes 对象设置图表元素
ax.set_xlabel('X Values')
ax.set_ylabel('Y Values')
ax.set_title('面向对象方式绘制的图表')
ax.legend()
ax.grid(True)

# 可以对 Figure 对象进行操作,例如保存
fig.savefig('oo_plot.png', dpi=300)

plt.show()

面向对象接口的优势在于,当你创建多个子图时,可以明确指定要在哪个 Axes 上进行操作,避免混淆。

4. 图表元素的精细化定制

Matplotlib 提供了极其丰富的参数和方法来定制图表的每一个细节。

标题与轴标签


fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('我的图表标题', fontsize=16, color='darkblue')
ax.set_xlabel('横轴名称', fontsize=12, color='gray')
ax.set_ylabel('纵轴名称', fontsize=12, color='gray', rotation=0, ha='right') # rotation旋转,ha对齐方式
plt.show()

图例


fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6], label='数据系列A')
ax.plot([1, 2, 3], [6, 5, 4], label='数据系列B')
ax.legend(loc='upper right', shadow=True, fancybox=True, framealpha=0.8, borderpad=1) # 位置、阴影、圆角、透明度、边框内填充
plt.show()

颜色、线型、标记

在 `plot()` 方法中,可以大量定制:


fig, ax = plt.subplots()
ax.plot([0, 1, 2], [0, 1, 0], color='green', linewidth=3, linestyle='-.', marker='s', markersize=10, markeredgecolor='black', markerfacecolor='yellow')
plt.show()
  • `color`: 颜色 (如 ‘red’, ‘blue’, ‘#FF00FF’, (0.1, 0.2, 0.3))
  • `linewidth`: 线宽
  • `linestyle`: 线型 (如 ‘-‘, ‘–‘, ‘:’, ‘-.’)
  • `marker`: 标记样式 (如 ‘o’, ‘x’, ‘^’, ‘s’, ‘D’)
  • `markersize`: 标记大小
  • `markeredgecolor`: 标记边缘颜色
  • `markerfacecolor`: 标记填充颜色

轴刻度与范围


fig, ax = plt.subplots()
ax.plot(np.random.rand(10))
ax.set_xlim(-0.5, 9.5) # 设置X轴范围
ax.set_ylim(0, 1.2)   # 设置Y轴范围
ax.set_xticks(np.arange(0, 10, 2)) # 设置X轴刻度位置
ax.set_yticks([0, 0.5, 1.0]) # 设置Y轴刻度位置
ax.tick_params(axis='x', rotation=45) # 旋转X轴刻度标签
plt.show()

网格线


fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.grid(True, linestyle=':', alpha=0.6, color='gray') # 开启网格线,设置样式、透明度、颜色
plt.show()

文本注释


fig, ax = plt.subplots()
x_val = 2
y_val = 5
ax.plot([1, 2, 3], [4, 5, 6])
ax.annotate(f'重要点 ({x_val}, {y_val})', xy=(x_val, y_val), xytext=(x_val + 0.5, y_val + 0.5),
            arrowprops=dict(facecolor='black', shrink=0.05),
            fontsize=10, color='red')
plt.show()

子图布局

创建多个子图是展示复杂数据的重要方式。

  • `plt.subplot()` (Pyplot 风格):

    通过 `plt.subplot(nrows, ncols, index)` 创建。

    
    plt.figure(figsize=(10, 5))
    
    plt.subplot(1, 2, 1) # 1行2列的第1个子图
    plt.plot(np.random.rand(10), color='blue')
    plt.title('子图 1')
    
    plt.subplot(1, 2, 2) # 1行2列的第2个子图
    plt.hist(np.random.randn(100), bins=10, color='orange')
    plt.title('子图 2')
    
    plt.tight_layout() # 自动调整子图参数,使之填充整个 figure 区域
    plt.show()
            
  • `plt.subplots()` (面向对象风格,推荐):

    同时创建 Figure 和 Axes 对象数组。

    
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) # 创建 2x2 的子图布局
    
    # axes 是一个 2x2 的 NumPy 数组,通过索引访问每个 Axes
    axes[0, 0].plot(np.sin(np.linspace(0, 10, 50)), color='red')
    axes[0, 0].set_title('左上角')
    
    axes[0, 1].scatter(np.random.rand(50), np.random.rand(50), color='green')
    axes[0, 1].set_title('右上角')
    
    axes[1, 0].bar(['A', 'B', 'C'], [10, 20, 15], color='blue')
    axes[1, 0].set_title('左下角')
    
    axes[1, 1].pie([25, 30, 45], labels=['苹果', '香蕉', '橙子'], autopct='%1.1f%%', colors=['lightcoral', 'lightskyblue', 'lightgreen'])
    axes[1, 1].set_title('右下角')
    axes[1, 1].set_aspect('equal') # 确保饼图是圆的
    
    plt.tight_layout() # 自动调整布局
    plt.show()
            

5. 保存图表

保存图表非常重要,通常在面向对象接口下使用 `fig.savefig()` 方法。


fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(np.linspace(0, 5, 10), np.random.rand(10), 's-')
ax.set_title('我的专业图表')

# 保存为高质量 PNG 文件,dpi=300 表示每英寸300个像素,图像更清晰
fig.savefig('professional_plot.png', dpi=300) 

# 保存为矢量图 PDF,`bbox_inches='tight'` 可以去除多余的白边
fig.savefig('professional_plot.pdf', bbox_inches='tight')

print("图表已保存为 professional_plot.png 和 professional_plot.pdf")
  • `dpi`: 设置分辨率,对于打印或高质量显示,通常设为 300 或更高。
  • `bbox_inches=’tight’`: 尝试修剪图表周围的空白边距。
  • `transparent=True`: 使图表背景透明。

6. 高级应用与集成

与 Pandas 的集成

Pandas 的 DataFrame 和 Series 对象可以直接调用 `.plot()` 方法,方便快捷。这些方法内部使用了 Matplotlib。


import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')).cumsum()
df['E'] = np.random.randint(0, 7, 100)

# 绘制线图
df[['A', 'B']].plot(title='Pandas Line Plot')
plt.show()

# 绘制散点图
df.plot.scatter(x='C', y='D', c='E', cmap='viridis', s=df['E']*20, title='Pandas Scatter Plot')
plt.show()

# 绘制直方图
df['A'].plot.hist(bins=20, title='Pandas Histogram')
plt.show()

交互式绘图

在某些环境中,Matplotlib 可以提供基本的交互性(如缩放、平移)。在 Jupyter 中,`%matplotlib notebook` 或 `%matplotlib widget` 可以开启更丰富的交互功能。

动画效果

Matplotlib 的 `animation` 模块允许创建动态图表,例如展示数据随时间变化的过程。


from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'ro') # 初始化一个空行对象

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
# ani.save('sine_wave.gif', writer='imagemagick') # 保存为GIF
plt.show()

三维绘图

通过导入 `mpl_toolkits.mplot3d` 可以绘制三维图表。


from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 示例:三维散点图
xs = np.random.rand(100)
ys = np.random.rand(100)
zs = np.random.rand(100)
ax.scatter(xs, ys, zs, c='r', marker='o')

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

样式表与主题

Matplotlib 提供了多种预设样式,可以快速改变图表的外观。


plt.style.use('ggplot') # 使用 'ggplot' 样式
# plt.style.use('seaborn-v0_8') # 或其他样式如 'seaborn-v0_8', 'fivethirtyeight', 'dark_background' 等
# 可以通过 plt.style.available 查看所有可用样式

fig, ax = plt.subplots()
ax.plot(np.random.rand(10), label='随机数据')
ax.set_title('使用 ggplot 样式')
ax.legend()
plt.show()

plt.style.use('default') # 恢复默认样式

通过上述内容,我们可以看到 Matplotlib 提供了一个极为丰富和灵活的绘图框架,无论是最简单的线图,还是复杂的科学可视化,都能通过其强大的 API 和广泛的定制选项来实现。掌握 Matplotlib 不仅能让你高效地创建高质量图表,更能为你理解和驾驭 Python 数据可视化生态中的其他工具打下坚实基础。

pythonmatplotlib画图