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

Posted

技术标签:

【中文标题】如何在一个图中制作超过 10 个子图?【英文标题】:How to make more than 10 subplots in a figure? 【发布时间】:2016-09-22 07:31:51 【问题描述】:

我正在尝试制作一个 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 个子图,或者有办法绕过它,还是我误解了它的工作原理?

提前谢谢你。

【问题讨论】:

使用逗号:plt.subplot(5,4,20)。您可以在 documentation 中找到此行为。 也相关(虽然问题质量低):***.com/questions/35510155/matplotlib-subplot 【参考方案1】:

您可能正在寻找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()

,结果如下:

您是否应该构建嵌套循环来制作完整的网格:

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()

,你会得到这个:

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

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()

,结果如下:

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

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()

,因此:

在我一开始提供的链接中,您还可以找到删除标签等内容的示例。

【讨论】:

为什么要包含plot = []?在这种情况下有什么用处?

以上是关于如何在一个图中制作超过 10 个子图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 matplotlib 创建子图的大图?

如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?

如何在R子图中添加茎叶图

如何在另一个python图中添加不同的图(作为插图)[重复]

在交互图中重新定位 yTickLabels

如何控制每个子图中我的 y 标签之间的间距(matplotlib)[重复]