如何让坐标轴占据多个子图使用pyplot
我想在一个图形中放三个图。这个图形应该是一个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()
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矩阵的第三个部分,也就是左下角。