matplotlib subplot绘制多个子图的方法示例

1. matplotlib subplot绘制多个子图的方法示例

在数据可视化中,常常需要同时比较多个数据子集。为此,我们需要在同一个图形中绘制多个子图。而matplotlib提供了很方便的方式实现这一目的,即subplot方法。

1.1 subplot方法概述

subplot方法是matplotlib中的一个函数,用于在同一个图形中绘制多个子图。该方法的语法如下:

subplot(nrows, ncols, index, **kwargs)

其中,nrows和ncols分别表示子图格网的行数和列数,index表示当前子图在格网中的位置(从1开始计数)。kwargs可以用来设置一些可选的参数,比如设置坐标轴范围、标题等。

使用subplot方法,我们可以在同一个figure对象中创建多个子图。下面是一个简单的例子,其中我们绘制了一个包含4个子图的图形:

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(0, 2*np.pi, 400)

y = np.sin(x**2)

fig, axs = plt.subplots(2, 2, figsize=(10, 6))

axs[0, 0].plot(x, y)

axs[0, 0].set_title('subplot(2, 2, 1)')

axs[0, 1].plot(x, y, 'tab:orange')

axs[0, 1].set_title('subplot(2, 2, 2)')

axs[1, 0].plot(x, -y, 'tab:green')

axs[1, 0].set_title('subplot(2, 2, 3)')

axs[1, 1].plot(x, -y, 'tab:red')

axs[1, 1].set_title('subplot(2, 2, 4)')

for ax in axs.flat:

ax.set(xlabel='x-label', ylabel='y-label')

# 隐藏未使用到的坐标轴

for ax in axs.flat:

ax.label_outer()

在这个例子中,我们使用subplot(2, 2, k)方法在一个包含4个子图的大图中创建每个子图。axs对象表示这4个子图的Axes对象,我们可以使用其提供的方法对每个子图进行设置。

最后,我们在这个例子中还使用了一些其它的函数,比如figsize可以设置图形的尺寸,flat方法可以将axs数组转换为一个一维数组,label_outer方法可以隐藏未使用到的坐标轴。这些函数的详细说明可以参考matplotlib文档。

1.2 subplot方法的一些常见用法

除了上述用法,subplot方法还有一些其它的常见用法,这里我们逐一介绍。

1.2.1 subplot2grid方法

subplot2grid方法是matplotlib中的一个高级函数,它可以帮助我们更方便地创建多个子图。与subplot方法不同,subplot2grid方法按照网格方式对图形进行划分。

subplot2grid方法的语法如下:

subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)

其中,shape表示子图的网格形状,loc表示当前子图在网格中的位置。rowspan和colspan参数表示当前子图在网格中占据的行数和列数。kwargs参数可以用来设置一些可选的参数,比如坐标轴范围、标题等。

下面是一个例子,其中我们使用subplot2grid方法创建了一个网格形状为(3, 3)的子图:

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(0, 2*np.pi, 400)

y = np.sin(x**2)

fig = plt.figure(figsize=(8, 6))

ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)

ax1.plot(x, y)

ax1.set_title('subplot2grid(3, 3, (0, 0), colspan=2)')

ax2 = plt.subplot2grid((3, 3), (0, 2))

ax2.plot(x, y, 'tab:orange')

ax2.set_title('subplot2grid(3, 3, (0, 2))')

ax3 = plt.subplot2grid((3, 3), (1, 0), rowspan=2)

ax3.plot(x, y, 'tab:green')

ax3.set_title('subplot2grid(3, 3, (1, 0), rowspan=2)')

ax4 = plt.subplot2grid((3, 3), (1, 1), rowspan=2, colspan=2)

ax4.plot(x, -y, 'tab:red')

ax4.set_title('subplot2grid(3, 3, (1, 1), rowspan=2, colspan=2)')

plt.tight_layout()

在这个例子中,我们使用subplot2grid方法将一个包含4个子图的大图划分为一个3x3的网格,并在这个网格上创建4个子图。与前面的例子不同,这里我们不需要使用二维数组来保存子图对象。相反,我们直接使用ax1、ax2、ax3、ax4等变量来保存每个子图对象。

此外,在这个例子中,我们还使用了一个新的函数tight_layout。该函数可以自动调整子图之间的间距和边距,以避免子图之间重叠和超出图形边界。

1.2.2 add_subplot方法

add_subplot方法是Axes对象的一个方法,用于在当前Axes对象中添加一个子图。

该函数的语法如下:

add_subplot(*args, **kwargs)

其中,*args和**kwargs参数与subplot方法相同。如果当前Axes对象已经存在,则add_subplot方法会将新创建的子图添加到该对象中;否则,它会首先创建一个新的Axes对象,然后再添加子图。

下面是一个例子,其中我们使用add_subplot方法在一个已有子图中添加了一个新的子图:

import matplotlib.pyplot as plt

import numpy as np

fig, axs = plt.subplots(1, 2, figsize=(8, 4))

x = np.linspace(0, 2*np.pi, 400)

y = np.sin(x**2)

axs[0].plot(x, y)

axs[0].set_title('subplot(1, 2, 1)')

ax2 = axs[1].add_subplot(2, 2, 1)

ax2.plot(x, y, 'tab:orange')

ax2.set_title('add_subplot(2, 2, 1)')

axs[1].set_title('subplot(1, 2, 2)')

plt.tight_layout()

在这个例子中,我们首先使用subplot方法创建了一个包含两个子图的大图。接着,我们使用add_subplot方法在第二个子图中添加了一个新的子图。需要注意的是,我们使用axs[1]来获取该子图的对应Axes对象,而不是直接使用add_subplot(2, 2, 1)来创建新的子图。

2. 总结

subplot方法是matplotlib中一个非常实用的函数,它可以帮助我们在同一个图形中绘制多个子图。除了常规的subplot方法之外,还有一些高级的函数,如subplot2grid和add_subplot,可以更加灵活地创建子图。通过综合运用这些函数,我们可以快速、方便地创建多个子图,并进行数据可视化。

最后,需要注意的是,matplotlib提供了丰富的接口和工具,更多的功能和技巧需要读者自行发掘。

后端开发标签