如何让坐标轴占据多个子图使用pyplot

77 投票
7 回答
106876 浏览
提问于 2025-04-15 19:18

我想在一个图形中放三个图。这个图形应该是一个2x2的子图布局,也就是说,第一幅图要占据前两格(也就是整个第一行),而其他两幅图则放在第一幅图的下面,分别占据第三和第四格。

我知道在MATLAB中可以用subplot命令来实现这个效果,像这样:

subplot(2,2,[1,2]) % the plot will span subplots 1 and 2

那么在pyplot中,是否也可以让一个坐标轴占据多个子图呢?pyplot.subplot的文档里没有提到这个问题。

有没有简单的解决办法呢?

7 个回答

40

如果你想要在一个图表中放多个子图,并且让它们共享一个坐标轴,你可以简单地这样做:

from matplotlib import pyplot as plt
import numpy as np

b=np.linspace(-np.pi, np.pi, 100)

a1=np.sin(b)

a2=np.cos(b)

a3=a1*a2

plt.subplot(221)
plt.plot(b, a1)
plt.title('sin(x)')

plt.subplot(222)
plt.plot(b, a2)
plt.title('cos(x)')

plt.subplot(212)
plt.plot(b, a3)
plt.title('sin(x)*cos(x)')

plt.show()

这里插入图片描述

还有另外一种方法是:

plt.subplot(222)
plt.plot(b, a1)
plt.title('sin(x)')

plt.subplot(224)
plt.plot(b, a2)
plt.title('cos(x)')

plt.subplot(121)
plt.plot(b, a3)
plt.title('sin(x)*cos(x)')

plt.show()

这里插入图片描述

67

这段内容提到了一种使用 GridSpec 来创建多列或多行子图布局的方法。下面是一个简化版的例子,包含了3个子图,效果大概是这样的:

import matplotlib.pyplot as plt

fig = plt.figure()

gs = fig.add_gridspec(2,2)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])

plt.show()

enter image description here

80

你可以简单地这样做:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 7, 0.01)
    
plt.subplot(2, 1, 1)
plt.plot(x, np.sin(x))
    
plt.subplot(2, 2, 3)
plt.plot(x, np.cos(x))
    
plt.subplot(2, 2, 4)
plt.plot(x, np.sin(x)*np.cos(x))

也就是说,第一个图是在上半部分(这个图只分成了2x1=2个区域),而接下来的两个小图是在一个2x2=4个区域的网格中完成的。subplot()的第三个参数是图在这个网格中的位置(按照英语的阅读方向,区域1在左上角):例如在第二个子图中(subplot(2, 2, 3)),坐标轴会放在这个2x2矩阵的第三个部分,也就是左下角。

在这里输入图片描述

撰写回答