如何在matplotlib中获得多个子图?


156

我对这段代码的工作方式有些困惑:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

在这种情况下,无花果轴如何工作?它有什么作用?

另外,为什么这项工作不做同样的事情:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

1
从matplotlib 2.1开始,第二个代码开始工作
费米悖论

Answers:


210

有几种方法可以做到这一点。该subplots方法将创建图形以及随后存储在ax数组中的子图。例如:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

在此处输入图片说明

但是,类似的事情也可以使用,但是并不是很“干净”,因为您要创建带有子图的图形,然后在其上添加:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

在此处输入图片说明


4
而不是plot(x, y)让图来自用户定义的函数,该函数使用networkx创建图形。如何使用它?
Sigur

是否可以在没有for循环的情况下生成多个子图?例如一些矢量化的解决方案,以在单独的图上绘制多列数据?使用R中的ggplot非常简单,但使用Python似乎不可能。
user2739472

3
您可以将两个for循环减少为一个axn = ax.flatten(),然后 for axes in axn: axes.plot(x,y)
wander95 '19

@ wander95谢谢您,如果没有您,此答案不适用于col = 1或row = 1
Gulzar

48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

在此处输入图片说明


1
我得到的是什么ax,但不是fig。这些是什么?
Leevo

3
ax实际上是一个numpy数组。无花果是一matplotlib.figure.Figure类,通过它您可以对绘制的图进行很多操作。例如,您可以将颜色栏添加到特定的子图,您可以更改所有子图后面的背景色。您可以修改这些子图的布局,或为其添加新的小斧头。最好您可能希望所有可以通过fig.suptitle(title)method 获得的子图都有一个主标题。最后,一旦对图满意,就可以使用fig.savefig方法保存它。@Leevo
Khalil Al Hooti

21
  • 您也可以在子图调用中打开轴的包装

  • 并设置是否要在子图之间共享x和y轴

像这样:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

在此处输入图片说明


14

您可能对以下事实感兴趣:从matplotlib 2.1版开始,问题的第二个代码也很好用。

更改日志

Figure类现在具有subplots方法Figure类现在具有subplots()方法,该方法的行为与pyplot.subplots()相同,但是在现有的图形上。

例:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()

我得到了:AttributeError Traceback(最近一次呼叫最近)<ipython-input-168-ed25aa5255fa>在<module>()2 3 fig = plt.figure()----> 4轴= fig.subplots(nrows = 2 ,NCOLS = 2)AttributeError的:“图”对象没有属性“次要情节”
鲁施密特

1
@LudoSchmidt答案是“截至matplotlib 2.1版...”
ImportanceOfBeingErnest

11

阅读文档:matplotlib.pyplot.subplots

pyplot.subplots()返回一个fig, ax用符号解压缩为两个变量的元组

fig, axes = plt.subplots(nrows=2, ncols=2)

代码

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

不起作用,因为subplots()pyplot不是对象成员的函数Figure

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.