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

时间:2015-07-30 14:31:58

标签: python matplotlib subplot

我对此代码的工作方式感到有些困惑:

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

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

同样为什么这不能做同样的事情:

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

由于

8 个答案:

答案 0 :(得分:108)

有几种方法可以做到这一点。 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()

enter image description here

然而,这样的东西也会起作用,但它不是那么“干净”,因为你正在创建一个包含子图的图形,然后添加它们:

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

enter image description here

答案 1 :(得分:12)

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

enter image description here

答案 2 :(得分:8)

阅读文档:matplotlib.pyplot.subplots

var printWindow = window.open('', '_blank'); printWindow.document.write(clonedElement.html()); printWindow.onreadystatechage = function() { console.log('this does not work.'); }; 返回一个元组pyplot.subplots(),使用符号将其解压缩为两个变量

fig, ax

代码

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

不起作用,因为fig = plt.figure() axes = fig.subplots(nrows=2, ncols=2) subplots()中的函数,而不是对象pyplot的成员。

答案 3 :(得分:7)

您可能感兴趣的是,从matplotlib 2.1版开始,问题中的第二个代码也可以正常工作。

来自change log

  

图类现在有子图方法   Figure类现在有一个subplots()方法,其行为与pyplot.subplots()相同,但在现有数字上。

示例:

import matplotlib.pyplot as plt

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

plt.show()

答案 4 :(得分:4)

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

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

赞:

tim@Tim:~$ ./renewMac.sh
Old MAC:
    ether 88:e9:fe:83:XX:XX
New MAC (cd:4c:a0:01:9f:e4):
    ether 88:e9:fe:83:XX:XX

答案 5 :(得分:3)

# Generate figure and its subplots
fig, axes = plt.subplots(nrows, ncols)

依次遍历所有子图:

for ax in axes.flatten():
    ax.plot(x,y)

通过索引访问特定的子图:

for row in range(nrows):
    for col in range(ncols):
        axes[row,col].plot(x[row], y[col])

答案 6 :(得分:0)

如果您确实想使用循环,请执行以下操作。没人真正回答过如何循环馈送数据:

def plot(data):
    fig = plt.figure(figsize=(100, 100))
    for idx, k in enumerate(data.keys(), 1):
        x, y = data[k].keys(), data[k].values
        plt.subplot(63, 10, idx)
        plt.bar(x, y)  
    plt.show()

答案 7 :(得分:0)

其他答案都很棒,这个答案是可能有用的组合。

import numpy as np
import matplotlib.pyplot as plt

# Optional: define x for all the sub-plots
x = np.linspace(0,2*np.pi,100)

# (1) Prepare the figure infrastructure 
fig, ax_array = plt.subplots(nrows=2, ncols=2)

# flatten the array of axes, which makes them easier to iterate through and assign
ax_array = ax_array.flatten()

# (2) Plot loop
for i, ax in enumerate(ax_array):
  ax.plot(x , np.sin(x + np.pi/2*i))
  #ax.set_title(f'plot {i}')

# Optional: main title
plt.suptitle('Plots')

code result: plots

总结

  1. 准备图形基础结构

    • 获取 ax_array,一个子图数组
    • 展平数组以便在一个“for 循环”中使用它
  2. 绘制循环

    • 在展平的 ax_array 上循环以更新子图
    • 可选:使用枚举来跟踪子图编号