在Matplotlib中,该参数在fig.add_subplot(111)中意味着什么?


472

有时我遇到这样的代码:

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()是什么意思?

Answers:


470

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

的替代形式add_subplot(111)add_subplot(1, 1, 1)


18
是否有关于此的详细文档?在这种情况下,1x1网格和2x3网格之间有什么区别?
donatello 2010年

19
1x1网格= 1行1列 2x3网格= 2行3列 第三个数字从1开始,并从第一行开始递增。有关更多信息,请参见subplot()的文档。
Christian Alis

18
正如其他人解释的(两年多以前),这是matlab的遗产。但是,为了将来的读者,您应该知道,存在一种更好的subplots()方法形式。
jarondl

26
传统的文件subplot()在这里subplots()在这里
crayzeewulf

511

我认为最好用以下图片解释:

在此处输入图片说明

要初始化以上内容,请输入:

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

19
我认为带逗号的版本比带3位数字的版本更直观和可读性
endolith 2014年

很棒的是,它显示了如何像上述示例一样是2x2网格或4x4图形的网格等,将“子图形放置在网格中”。但是,有人可以解释一下确定显示的那些图形的大小的原因。我发现(2,2,1)的默认值很小,我希望它的大小可能是该大小的两倍或更大。
yoshiserry 2014年

7
这很有帮助。如果图片不是正方形(2x2),则这张图片会更好一些,但非常有帮助。
TravisJ 2015年

@TravisJ哇,真是巧合!在您写一个小时之前,我一直在想完全相同的事情!我会尽快更改它:)
SaiyanGirl

7
很有帮助的答案!虽然我认为编辑不准确。Matplotlib不支持使用像1:2或[1 3]这样的语句来跨越子图的行为(至少不支持1.5.0),并且似乎仅是Matlab。(请注意,Matplotlib中还有其他选项可以实现此功能,例如gridspec
实验

39

康斯坦丁的答案很明确,但对于更多背景,此行为是从Matlab继承的。

Matlab文档的“ 图形设置-每个图形显示多个图形”部分介绍了Matlab行为。

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


2
这是matplotlib,而不是matlab。
dom0 2012年

45
matplotlibs的许多行为都继承自Matlab。由于Matlab文档更好,所以我认为这可能有助于解释此特定函数调用的行为。是的,您是正确的,这个(问题)与matplotlib有关。该matplotlib次要情节的文档在我看来不太清楚。
DaveTM

7
MATLAB文档已移动
dotancohen 2014年

20

我的解决方案是

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

具有1和3合并的2x2网格


15

在此处输入图片说明

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列的布局中创建第一个子图。

第一列中的三个图形表示3行。第二个图位于同一列中的第一个图的正下方,依此类推。

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


10

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个子图。它的位置是第一。一共有2行,一列,因此可以绘制2个子图。其位置为第2个


2

add_subplot()方法有几个调用签名:

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

通话1和2:

呼叫1和2实现彼此相同的功能(最大限制,如下所述)。可以将它们视为首先指定前两个数字(2x2、1x8、3x4等)的网格布局,例如:

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

两者都产生3行4列的(3 x 4 = 12)子图的子图排列。每次调用中的第三个数字表示要返回的轴对象,从左上方的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()

子图

您可以看到在LHS上调用1可以返回任何轴对象,但是在RHS上调用2只能返回到index = 9渲染子图j),k)和l)无法访问的状态。

即,它从文档中说明了这一点

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


致电3

在极少数情况下,可以使用单个参数调用add_subplot,该子图坐标轴实例已在当前图形中创建,但未在图形的坐标轴列表中创建。


致电4(自3.1.0起):

如果未传递任何位置参数,则默认为(1,1,1)。

即,重现fig.add_subplot(111)问题中的呼叫。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.