## 问题：如何在matplotlib中获得多个子图？

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

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

I am a little confused about how this code works:

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

How does the fig, axes work in this case? What does it do?

Also why wouldn’t this work to do the same thing:

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

## 回答 0

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

There are several ways to do it. The `subplots` method creates the figure along with the subplots that are then stored in the `ax` array. For example:

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

However, something like this will also work, it’s not so “clean” though since you are creating a figure with subplots and then add on top of them:

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

## 回答 1

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

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

## 回答 2

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

• 并设置是否要在子图之间共享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()
``````

• You can also unpack the axes in the subplots call

• And set whether you want to share the x and y axes between the subplots

Like this:

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

## 回答 3

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

``````import matplotlib.pyplot as plt

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

plt.show()``````

You might be interested in the fact that as of matplotlib version 2.1 the second code from the question works fine as well.

From the change log:

Figure class now has subplots method The Figure class now has a subplots() method which behaves the same as pyplot.subplots() but on an existing figure.

Example:

``````import matplotlib.pyplot as plt

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

plt.show()
``````

## 回答 4

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

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

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

`pyplot.subplots()` returns a tuple `fig, ax` which is unpacked in two variables using the notation

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

the code

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

does not work because `subplots()`is a function in `pyplot` not a member of the object `Figure`.