如何在一个数字中制作超过10个子图?

时间:2016-05-24 21:52:21

标签: python matplotlib figure subplot

我正在尝试制作一个5x4网格的子图,从查看示例看来,最好的方法是:

import matplotlib.pyplot as plt
plt.figure()
plt.subplot(221)

其中子图(22)中的前两个数字表示它是2x2网格,第三个数字表示您正在制作的4个中的哪一个。但是,当我尝试这个时,我不得不去:

plt.subplot(5420)

我得到了错误:

ValueError: Integer subplot specification must be a three digit number.  Not 4

那么这是否意味着你不能制作更多的10个子图,或者是否有办法绕过它,或者我误解它是如何工作的?

提前谢谢。

1 个答案:

答案 0 :(得分:11)

您可能正在寻找GridSpec。您可以说明网格的大小(5,4)和每个图的位置(行= 0,列= 2,即-0,2)。请检查以下示例:

import matplotlib.pyplot as plt

plt.figure(0)
ax1 = plt.subplot2grid((5,4), (0,0))
ax2 = plt.subplot2grid((5,4), (1,1))
ax3 = plt.subplot2grid((5,4), (2, 2))
ax4 = plt.subplot2grid((5,4), (3, 3))
ax5 = plt.subplot2grid((5,4), (4, 0))
plt.show()

,结果如下:

gridspec matplotlib example

您是否应构建嵌套循环以构建完整网格:

import matplotlib.pyplot as plt

plt.figure(0)
for i in range(5):
    for j in range(4):
        plt.subplot2grid((5,4), (i,j))
plt.show()

,你会得到这个:

full 5x4 grid in gridspec matplotlib

这些图的工作方式与任何子图中的相同(直接从您创建的轴中调用它):

import matplotlib.pyplot as plt
import numpy as np

plt.figure(0)
plots = []
for i in range(5):
    for j in range(4):
        ax = plt.subplot2grid((5,4), (i,j))
        ax.scatter(range(20),range(20)+np.random.randint(-5,5,20))
plt.show()

,结果如下:

multiple scatterplots in gridspec

请注意,您可以为绘图提供不同的大小(说明每个绘图的列数和行数):

import matplotlib.pyplot as plt

plt.figure(0)
ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)
ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)
ax3 = plt.subplot2grid((3,3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3,3), (2, 0))
ax5 = plt.subplot2grid((3,3), (2, 1))
plt.show()

,因此:

different sizes for each plot in gridspec

在我在开头给出的链接中,您还会找到删除标签的示例。