16 使用 Subplots 创建多图布局

16 使用 Subplots 创建多图布局

在数据可视化中,有时候我们需要将多个图表并排或按网格排列展示。Matplotlib 提供了一个强大的工具来实现这一点,那就是 subplots 函数。它允许我们在一个图形中创建多个子图,可以帮助我们更有效地比较和展示数据。

基本用法

subplots 函数的基本语法如下:

1
fig, axs = plt.subplots(nrows, ncols)
  • nrows:子图的行数
  • ncols:子图的列数
  • fig:整个图形对象
  • axs:包含所有子图的数组

示例:创建 2x2 的子图布局

下面的案例展示了如何创建一个 2 行 2 列的子图布局,并在每个子图中绘制不同的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 10)

# 创建子图
fig, axs = plt.subplots(2, 2, figsize=(10, 8))

# 在第一个子图中绘制正弦函数
axs[0, 0].plot(x, y1, color='blue')
axs[0, 0].set_title('正弦函数')
axs[0, 0].grid()

# 在第二个子图中绘制余弦函数
axs[0, 1].plot(x, y2, color='orange')
axs[0, 1].set_title('余弦函数')
axs[0, 1].grid()

# 在第三个子图中绘制正切函数
axs[1, 0].plot(x, y3, color='green')
axs[1, 0].set_title('正切函数')
axs[1, 0].grid()

# 在第四个子图中绘制指数函数
axs[1, 1].plot(x, y4, color='red')
axs[1, 1].set_title('指数函数')
axs[1, 1].grid()

# 调整布局
plt.tight_layout()
plt.show()

解释代码

  1. 导入库

    • 我们首先导入了 matplotlib.pyplotnumpy
  2. 创建数据

    • 使用 np.linspace 生成从 0 到 10 的 100 个点,并计算对应的 sincostanexp 函数值。
  3. 创建子图

    • 通过 plt.subplots(2, 2) 创建一个 2x2 的子图布局。
    • figsize=(10, 8) 设置了整个图形的大小。
  4. 绘制图表

    • 每个子图通过 axs[row, col] 访问,并使用 plot 方法绘制不同的函数。
    • 每个子图上我们还设置了标题和网格。
  5. 调整布局

    • 使用 plt.tight_layout() 来自动调整子图之间的间隔,以避免重叠。

自定义子图

subplots 还允许你对子图进行自定义,例如共享坐标轴、指定图形的大小等。

示例:共享坐标轴

假设我们希望所有的子图共享 x 轴,可以在创建子图时指定 sharex=True

1
fig, axs = plt.subplots(2, 2, sharex=True, figsize=(10, 8))

如此一来,所有子图的 x 轴范围将保持一致,这在比较数据时是非常有用的。

总结

使用 Matplotlibsubplots 函数可以轻松创建多个子图,帮助我们有效地展示和比较数据。通过灵活的参数和设置,可以根据需要自定义图形布局。在数据可视化中,这使得展示更为直观和美观。

17 绘制三维图形

17 绘制三维图形

在数据可视化中,三维图形可以帮助我们更好地理解复杂的数据结构。在 Matplotlib 中,我们可以使用 mpl_toolkits.mplot3d 模块来绘制三维图形。接下来,我们将通过几个案例来演示如何绘制不同类型的三维图形。

1. 初始化三维绘图

首先,我们需要导入所需的库和模块,并创建一个三维的绘图对象。以下是一个基本的设置示例:

1
2
3
4
5
6
7
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 创建绘图对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

2. 绘制三维散点图

三维散点图可以用来显示数据点在三维空间中的分布。下面是一个简单的三维散点图示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 生成随机数据
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
z = np.random.rand(n)

# 绘制散点图
ax.scatter(x, y, z, c='r', marker='o')

# 设置标签
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.show()

在这个例子中,我们生成了 100 个随机点,并通过 ax.scatter() 方法绘制了三维散点图。

3. 绘制三维线框图

三维线框图可以帮助我们观察三维数据结构的整体形状。以下是绘制线框图的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建网格数据
x = np.arange(-5, 5, 0.25)
y = np.arange(-5, 5, 0.25)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))

# 绘制线框图
ax.plot_wireframe(x, y, z, color='blue')

# 设置标签
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.show()

这里我们通过 np.meshgrid() 函数生成了网格数据,并使用 ax.plot_wireframe() 方法绘制了线框图。

4. 绘制三维表面图

三维表面图常常用于可视化函数的值。以下是一个绘制表面图的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建网格数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.cos(np.sqrt(x**2 + y**2))

# 绘制表面图
ax.plot_surface(x, y, z, cmap='viridis')

# 设置标签
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.show()

在这个示例中,我们使用 ax.plot_surface() 方法绘制了函数的表面图,并通过 cmap 参数设置了颜色映射。

5. 旋转三维图形

在使用 Matplotlib 绘图时,有时需要对三维图形进行旋转以便更好地观察。这可以通过以下方式完成:

1
2
3
# 旋转图形
ax.view_init(elev=30, azim=45)
plt.show()

view_init() 方法可以调整视角,其中 elev 是从水平方向的高度角,而 azim 是方位角。

小结

在本节中,我们介绍了如何使用 Matplotlib 绘制三维图形,包括三维散点图、线框图和表面图。从基础的绘图到调整视角,这些技巧可以帮助你在数据可视化中更好地展示三维数据。通过实际案例的演练,您可以更深入理解如何灵活运用 Matplotlib 进行三维绘图。

18 动态更新图形

18 动态更新图形

在数据分析和可视化的过程中,动态更新图形是一个非常实用的功能。通过动态更新图形,您可以实时查看数据变化,尤其是在处理实时数据时显得尤为重要。

使用 FuncAnimation

Matplotlib 提供了 FuncAnimation 类,使得在图形中动态更新数据变得简单。FuncAnimation 通过反复调用一个更新函数,可以在图形上绘制出变化的数据。

示例:实时更新正弦波

下面是一个简单的示例,展示如何使用 FuncAnimation 动态更新正弦波的图形:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 设置图形和坐标轴
fig, ax = plt.subplots()
x = np.linspace(0, 2 * np.pi, 100)
line, = ax.plot(x, np.sin(x))

# 设置基本的坐标轴限制
ax.set_ylim(-1.5, 1.5)
ax.set_title('动态更新正弦波')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')

# 更新函数
def update(frame):
# 更新Y数据为正弦波,与时间相关
line.set_ydata(np.sin(x + frame / 10.0)) # 动态改变正弦波
return line,

# 创建动画
ani = FuncAnimation(fig, update, frames=np.arange(0, 100), interval=100)

# 显示图形
plt.show()

代码解析

  • import numpy as npimport matplotlib.pyplot as plt:导入必要的库。
  • fig, ax = plt.subplots():创建一个图形和坐标轴。
  • x = np.linspace(0, 2 * np.pi, 100):生成 0100 个等距点。
  • line, = ax.plot(x, np.sin(x)):绘制初始的正弦波曲线。
  • ax.set_ylim(-1.5, 1.5):设置 Y 轴的限制。
  • update(frame):定义更新函数,其中 frame 表示当前的帧数。
  • line.set_ydata(np.sin(x + frame / 10.0)):根据当前帧数更新 Y 数据,使得图形动态变化。
  • ani = FuncAnimation(fig, update, frames=np.arange(0, 100), interval=100):创建动画,将更新函数与图形进行关联,并设置帧数和更新间隔(毫秒)。
  • plt.show():显示图形窗口。

总结

通过 FuncAnimation,您可以轻松实现动态更新图形的效果。无论是实时数据监测,还是模拟变化的曲线,这种方法都可以让您直观地观察到数据随时间变化的趋势。使用动态更新图形可以使您的数据可视化更加生动有趣。