fig.add_subplot(111)中的参数是什么意思?

584
有时我会遇到这样的代码:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
fig = plt.figure()
fig.add_subplot(111)
plt.scatter(x, y)
plt.show()

这会产生:

示例图由包含的代码生成

我已经疯狂地阅读文档,但是我找不到说明111的解释。有时我看到212

fig.add_subplot()的参数意味着什么?

8个回答

620
我认为下面这张图片能最好地解释这个问题:

输入图像描述

要初始化上述内容,需要键入:
import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()

31
我认为带有逗号的版本比三位数字的版本更直观易读。 - endolith
这很棒,它展示了如何在网格中“定位子图”,无论是像上面的示例一样的2x2网格还是4x4图形的网格等。但是,有人能否解释一下确定显示的那些图形大小的因素是什么?我发现(2,2,1)的默认值相当小,我希望它可能是两倍或更大。 - yoshiserry
10
这非常有帮助。如果这张图片不是正方形(2x2),它会更好看,但总体来说非常有用。 - TravisJ
7
非常有帮助的回答!不过我认为修改是不准确的。在Matplotlib中,使用类似于1:2或[1 3]这样的语句来跨越子图是不被支持的(至少在1.5.0版本中不支持),这似乎只适用于Matlab。(请注意,在Matplotlib中还有其他选项可以实现此行为,例如gridspec - lab
2
我在图片上看不到任何区别,有什么我看不到的区别吗? - undefined
显示剩余5条评论

602

这些是以单个整数编码的子图网格参数。例如,“111”表示“1x1网格,第一个子图”,“234”表示“2x3网格,第四个子图”。

add_subplot(111) 的另一种形式是 add_subplot(1, 1, 1)


21
有关此事是否有详细文档?在这个情境下,1x1网格和2x3网格之间有什么区别? - donatello
26
1x1的网格指的是只有1行1列。2x3的网格指的是有2行3列。第三个数字从1开始,按行优先递增。请查看subplot()函数的文档获取更多信息。 - Christian Alis
20
如其他人所解释的(两年多前),这是Matlab的遗留问题。但为了日后阅读者的方便,您应该知道有一种更好的替代方法,即使用subplots()函数。 - jarondl
28
遗留的 subplot() 的文档位于此处,而 subplots() 的文档则位于此处 - crayzeewulf

52
Constantin的回答非常准确,但为了更多的背景知识,这种行为是从Matlab继承而来的。
Matlab的行为在Matlab文档的Figure Setup - Displaying Multiple Plots per Figure部分中有解释。

subplot(m,n,i)将图形窗口分成一个m×n的小子图矩阵,并选择第i个子图作为当前绘图。图形沿着窗口的上一行编号,然后是第二行,依此类推。


2
这是Matplotlib,不是Matlab。 - dom0
51
Matplotlib的很多行为都是继承自Matlab。由于Matlab文档更好,我认为它可能有助于解释这个特定函数调用的行为。是的,你说得对,这个问题涉及到matplotlib。在我看来,matplotlib subplot文档不够清晰。 - DaveTM
7
MATLAB文档已经迁移,请访问http://www.mathworks.com/help/matlab/ref/subplot.html。 - dotancohen

33

我的解决方案是

fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
plt.show()

2x2 grid with 1 and 3 merge


30

图片描述

import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)

第一段代码创建了一个布局,其中有3行2列,它创建了第一个子图。

第一列中的三个图表表示三行。第二个子图位于同一列中第一个子图的下方,以此类推。

最后两个子图具有参数(2, 2),表示第二列只有两行,位置参数按行移动。


20

add_subplot() 方法有几种调用方式:

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <-- 自3.1.0版本以来

第一次和第二次调用:

第一次和第二次调用实现了相同的功能(在下面解释的限制范围内)。可以将它们看作首先使用前两个数字指定网格布局(2x2、1x8、3x4等),例如:

f.add_subplot(3,4,1) 
# is equivalent to:
f.add_subplot(341)

两种方式都生成一个(3 x 4 = 12)个子图呈3行4列的子图安排。每个调用中的第{{3}}个数字表示返回哪个坐标轴对象,从左上角开始从{{1}}递增到右侧。
此代码说明了使用调用{{2}}的限制。
#!/usr/bin/env python3
import matplotlib.pyplot as plt

def plot_and_text(axis, text):
  '''Simple function to add a straight line
  and text to an axis object'''
  axis.plot([0,1],[0,1])
  axis.text(0.02, 0.9, text)

f = plt.figure()
f2 = plt.figure()

_max = 12
for i in range(_max):
  axis = f.add_subplot(3,4,i+1, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
  plot_and_text(axis,chr(i+97) + ') ' + '3,4,' +str(i+1))

  # If this check isn't in place, a 
  # ValueError: num must be 1 <= num <= 15, not 0 is raised
  if i < 9:
    axis = f2.add_subplot(341+i, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
    plot_and_text(axis,chr(i+97) + ') ' + str(341+i))

f.tight_layout()
f2.tight_layout()
plt.show()

subplots

通过在左侧使用调用 1,您可以返回任何轴对象;然而,在右侧使用调用 2时,您只能返回索引最多为9的轴对象,这使得子图j),k)和l)无法使用此调用访问。

即它阐明了这一点来自文档:

pos是一个三位数的整数,其中第一位是行数,第二位是列数,第三位是子图的索引。例如,fig.add_subplot(235)与fig.add_subplot(2, 3, 5)相同。 请注意,所有整数都必须小于10才能使用此形式


调用 3

在极少数情况下, add_subplot 可以被调用只传入一个参数,此时该参数应为一个子图axes实例,该实例已经在当前图形中创建,但未出现在图形的axes列表中。


调用 4(自 3.1.0 起):

如果没有传递位置参数,则默认为(1,1,1)。

也就是说,重现问题中的调用 fig.add_subplot(111)。这基本上设置了一个1×1的子图网格,并返回网格中第一个(也是唯一的)轴对象。


17

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW=行数
  • COLUMN=列数
  • POSITION=绘图位置

示例

`fig.add_subplot(111)` #There is only one subplot or graph  
`fig.add_subplot(211)`  *and*  `fig.add_subplot(212)` 

总共有2行,1列,因此可以绘制2个子图。它的位置是第1个。总共有2行,1列,因此可以绘制2个子图。它的位置是第2个。


4

fig.add_subplot(111) 就像 fig.add_subplot(1, 1, 1),其中的数字111表示子图网格参数,但编码为单个整数。

要在一个n*m网格中选择第k个子图,可以这样做:fig.add_subplot(n, m, k)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接