matplatlib绘图及多子图绘制
1、ax、fig、plt的含义
ax的含义
在Matplotlib中,ax
通常是指代图表的坐标轴对象(Axes)。它表示在图表中的一个独立的子图区域,可以在这个区域内进行数据的可视化和绘制。ax
对象提供了许多方法和属性,用于控制坐标轴的外观、标签、刻度等。
当你在Matplotlib中创建一个图表时,你通常会创建一个或多个ax
对象,每个ax
对象代表一个子图,你可以在每个子图中绘制不同的数据或图形。在多个ax
对象中,你可以灵活地控制每个子图的布局、样式和内容。
以下是一个简单的示例,展示了如何在一个图表中创建多个子图,每个子图使用不同的ax
对象:
import numpy as np
import matplotlib.pyplot as plt
# 创建画布和多个子图
fig, axs = plt.subplots(2, 2)
# 在每个子图中绘制不同的数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = x**2
y4 = np.exp(x)
axs[0, 0].plot(x, y1)
axs[0, 0].set_title('Sin(x)')
axs[0, 1].plot(x, y2)
axs[0, 1].set_title('Cos(x)')
axs[1, 0].plot(x, y3)
axs[1, 0].set_title('x^2')
axs[1, 1].plot(x, y4)
axs[1, 1].set_title('Exp(x)')
# 调整子图之间的间距
plt.tight_layout()
# 显示图表
plt.show()
在这个示例中,axs
是一个包含4个ax
对象的二维数组,我们可以通过索引来访问不同位置的子图,并在每个子图中绘制不同的数据。
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
fig的含义
在Matplotlib中,fig
(figure的缩写)表示一个绘图对象,它代表了整个绘图窗口。你可以将fig
看作是一个画布,你可以在上面绘制多个子图(axes),图像和其他元素。
在使用Matplotlib绘制图形时,通常的步骤是首先创建一个fig
对象,然后在fig
对象上添加一个或多个子图(axes
)。每个子图可以包含一个或多个图表(plot
、scatter
等),你可以在这些子图中进行绘制。
例如,下面是一个创建一个包含单个子图的fig
对象的示例:
import matplotlib.pyplot as plt
# 创建一个fig对象,即绘图窗口
fig = plt.figure()
# 在fig对象上添加一个子图
ax = fig.add_subplot(1, 1, 1)
# 在子图上绘制图表
ax.plot([1, 2, 3, 4], [2, 4, 6, 8])
# 显示绘图
plt.show()
在这个示例中,我们首先创建了一个fig
对象,然后使用fig.add_subplot()
方法添加了一个子图。子图使用网格布局,(1, 1, 1)
表示在一个1x1的网格中的第一个位置添加子图。最后,我们在子图上使用ax.plot()
绘制了一个简单的折线图。
plt的含义
在Matplotlib中,plt
是matplotlib.pyplot
模块的缩写,是Matplotlib库的一个子模块。matplotlib.pyplot
模块提供了一种类似于MATLAB绘图工具的界面,使得绘制图形变得更加简单和方便。
通过导入matplotlib.pyplot
模块并将其简写为plt
,你可以使用其中的函数来创建图形、绘制各种图表和进行各种图形操作。plt
模块中的函数提供了一种高级界面,允许你在绘图对象(figure
)、子图(axes
)和图表之间进行交互。
以下是一些常见的plt
模块函数的用法示例:
pythonCopy codeimport matplotlib.pyplot as plt
# 创建一个新的绘图对象
plt.figure()
# 在当前绘图对象上绘制折线图
plt.plot([1, 2, 3, 4], [2, 4, 6, 8], label='Line 1')
# 设置图标题、横轴标签和纵轴标签
plt.title('My Plot')
plt.xlabel('X Label')
plt.ylabel('Y Label')
# 添加图例
plt.legend()
# 显示网格
plt.grid(True)
# 显示绘图
plt.show()
通过使用plt
模块,你可以快速绘制图表、添加标签和图例、设置标题和轴标签等。这种简洁的界面使得绘图变得非常方便,并且适用于许多常见的绘图需求。
2、常规绘图
matplotlib.pyplot
是 Matplotlib 库中的一个子模块,用于绘制各种类型的图表,如折线图、散点图、柱状图、饼图等。它提供了一个高级接口,使得在 Python 中创建和自定义图表变得更加容易。以下是 matplotlib.pyplot
的一些常见用法:
1. 导入Matplotlib.pyplot:
在使用之前,首先需要导入 Matplotlib 和 pyplot
模块:
import matplotlib.pyplot as plt
2. 创建一个简单的折线图:
# 创建数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 20]
# 创建折线图
plt.plot(x, y)
# 添加标题和标签
plt.title('Simple Line Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 显示图
plt.show()
3. 创建一个散点图:
# 创建数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 20]
# 创建散点图
plt.scatter(x, y, marker='o', color='blue')
# 添加标题和标签
plt.title('Scatter Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 显示图
plt.show()
4. 创建一个柱状图:
# 创建数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [10, 15, 13, 18]
# 创建柱状图
plt.bar(categories, values)
# 添加标题和标签
plt.title('Bar Chart')
plt.xlabel('Categories')
plt.ylabel('Values')
# 显示图
plt.show()
5. 创建一个饼图:
# 创建数据
labels = ['Category A', 'Category B', 'Category C', 'Category D']
sizes = [10, 15, 13, 18]
# 创建饼图
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)
# 添加标题
plt.title('Pie Chart')
# 显示图
plt.show()
这只是 Matplotlib 的一小部分功能。您可以使用 pyplot
来自定义颜色、图例、刻度、网格等,以满足特定的图形需求。请参考 Matplotlib 官方文档和示例库以获取更多信息和示例:https://matplotlib.org/stable/contents.html
Matplotlib 是一个功能强大且高度可定制的库,使您能够创建各种类型的图表以及美观的数据可视化。
3、绘制子图
使用 Matplotlib 绘制子图(subplot)是一种在单个画布上创建多个子图的方法。您可以使用 plt.subplots
或 plt.subplot
函数来实现这一目标。以下是使用 Matplotlib 绘制子图的示例:
版本1:使用 plt.subplots
创建子图
版本1.1 单个绘图
import matplotlib.pyplot as plt
# 创建一张画布,分成 2 行 2 列,共 4 个子图
fig, axes = plt.subplots(2, 2, figsize=(8, 6))
# 在每个子图上绘制内容
axes[0, 0].plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25])
axes[0, 0].set_title('Subplot 1')
axes[0, 1].scatter([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
axes[0, 1].set_title('Subplot 2')
axes[1, 0].bar(['A', 'B', 'C', 'D'], [10, 15, 13, 18])
axes[1, 0].set_title('Subplot 3')
axes[1, 1].pie([20, 30, 15, 35], labels=['A', 'B', 'C', 'D'], autopct='%1.1f%%')
axes[1, 1].set_title('Subplot 4')
# 调整子图之间的间距
plt.tight_layout()
# 显示图
plt.show()
在上面的示例中,我们首先使用 plt.subplots
创建了一个包含 2 行 2 列的画布,并得到了包含子图的 axes
对象。然后,在每个子图上使用 axes
对象进行绘制,并为每个子图设置标题。最后,使用 plt.tight_layout()
来调整子图之间的间距,并通过 plt.show()
来显示图。
版本1.2 循环绘图
要在Matplotlib中创建一张画布上的一行三列的图,您可以使用plt.subplots
函数来创建子图,并使用ax
对象来绘制每个子图。以下是一个示例:
import matplotlib.pyplot as plt
# 创建一张画布,一行三列的图
fig, axes = plt.subplots(1, 3, figsize=(12, 4)) # 一行三列的图,设置画布大小
# 在每个子图上绘制内容
for i, ax in enumerate(axes):
x = [1, 2, 3, 4, 5]
y = [val ** (i + 1) for val in x]
ax.plot(x, y)
ax.set_title(f'Plot {i + 1}') # 设置每个子图的标题
# 调整子图之间的间距
plt.tight_layout()
# 显示图
plt.show()
在上面的示例中,我们首先使用plt.subplots
创建了一个一行三列的图,并传递了figsize
参数以设置画布的大小。然后,我们使用for
循环在每个子图上绘制内容,并设置每个子图的标题。最后,我们使用plt.tight_layout()
来调整子图之间的间距,以确保它们之间不会重叠。最后,通过plt.show()
来显示图。
您可以根据需要在每个子图上绘制不同的内容,并为每个子图设置不同的标题。这个示例是一个基本的演示,您可以根据您的需求进行自定义。
版本2:使用 plt.subplot
创建子图
您还可以使用 plt.subplot
函数来创建单个子图,如下所示:
import matplotlib.pyplot as plt
# 创建第一个子图
plt.subplot(2, 2, 1)
plt.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25])
plt.title('Subplot 1')
# 创建第二个子图
plt.subplot(2, 2, 2)
plt.scatter([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
plt.title('Subplot 2')
# 创建第三个子图
plt.subplot(2, 2, 3)
plt.bar(['A', 'B', 'C', 'D'], [10, 15, 13, 18])
plt.title('Subplot 3')
# 创建第四个子图
plt.subplot(2, 2, 4)
plt.pie([20, 30, 15, 35], labels=['A', 'B', 'C', 'D'], autopct='%1.1f%%')
plt.title('Subplot 4')
# 调整子图之间的间距
plt.tight_layout()
# 显示图
plt.show()
在这个示例中,我们使用 plt.subplot
函数分别创建了四个子图。与 plt.subplots
不同,plt.subplot
通过三个参数指定子图的行数、列数和子图的位置。然后,我们在每个子图上绘制内容并设置标题,最后调整子图之间的间距并显示图。
这是使用 Matplotlib 创建子图的两种常见方法。您可以根据需要选择其中一种,以创建不同数量和排列方式的子图。
版本3:使用add_subplot
创建子图
版本3.1 单个绘图
您可以使用Matplotlib的add_subplot
方法在一张画布上绘制一行三列的图。以下是如何使用add_subplot
来实现这一目标的示例:
import matplotlib.pyplot as plt
# 创建一张画布
fig = plt.figure(figsize=(12, 4))
# 添加子图1(一行三列中的第一个)
ax1 = fig.add_subplot(131) # 131 表示一行三列中的第一个图
ax1.set_title('Subplot 1')
ax1.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25])
# 添加子图2(一行三列中的第二个)
ax2 = fig.add_subplot(132) # 132 表示一行三列中的第二个图
ax2.set_title('Subplot 2')
ax2.plot([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
# 添加子图3(一行三列中的第三个)
ax3 = fig.add_subplot(133) # 133 表示一行三列中的第三个图
ax3.set_title('Subplot 3')
ax3.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1])
# 调整子图之间的间距
plt.tight_layout()
# 显示图
plt.show()
在上述示例中,我们首先创建了一张画布(fig
),然后使用fig.add_subplot
方法添加每个子图,其中131
表示一行三列中的第一个图,132
表示第二个,133
表示第三个。我们为每个子图设置了标题,并绘制了不同的数据。最后,使用plt.tight_layout()
来调整子图之间的间距,并通过plt.show()
来显示图。
您可以根据需要在每个子图上绘制不同的内容,并为每个子图设置不同的标题。这个示例是一个基本的演示,您可以根据您的需求进行自定义。
版本3.2 循环绘图
您可以使用循环来简化在一张画布上绘制一行三列的子图。以下是一个使用循环的示例:
import matplotlib.pyplot as plt
# 创建一张画布
fig = plt.figure(figsize=(12, 4))
# 子图数量
num_subplots = 3
for i in range(1, num_subplots + 1):
ax = fig.add_subplot(1, num_subplots, i)
ax.set_title(f'Subplot {i}')
x = [1, 2, 3, 4, 5]
y = [j ** i for j in x]
ax.plot(x, y)
# 调整子图之间的间距
plt.tight_layout()
# 显示图
plt.show()
在这个示例中,我们首先创建了一个包含三个子图的画布。然后,使用for
循环创建每个子图,设置标题,并绘制不同的数据。这使得代码更加简洁,并且您可以轻松扩展到任意数量的子图。最后,使用plt.tight_layout()
来调整子图之间的间距,并通过plt.show()
来显示图。
4、绘制三维图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
5、其他
如何设置图层顺序
在 Matplotlib 中,你可以使用 zorder
参数来设置图层的顺序。zorder
参数控制绘图元素的层次,具有较高值的元素将显示在较低值的元素之上。
默认情况下,绘图元素的 zorder
值为 0,你可以通过调整它来控制元素的显示顺序。值越大的元素将覆盖值较小的元素。
以下是一个示例,展示如何使用 zorder
参数来控制图层顺序:
import matplotlib.pyplot as plt
# 创建一些示例数据
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
# 绘制两个线条,同时设置不同的 zorder 值
plt.plot(x, y1, label='Line 1', color='blue', zorder=2)
plt.plot(x, y2, label='Line 2', color='red', zorder=1)
# 添加图例
plt.legend()
# 显示图形
plt.show()
在这个示例中,zorder
值较大的蓝色线条将显示在红色线条之上。你可以根据需要为不同的绘图元素设置不同的 zorder
值,以控制它们的显示层次。
一帧一帧画动图
plt.show(block=False)
plt.pause(0.001) # 添加适度的延迟时间
ax.cla()