使用 matplotlib 在一个循环内的两个单独图中的子图 windows

Subplots in two separate figure windows inside one loop using matplotlib

我想在 运行 通过一个循环时绘制两个单独的量。我想为每个数量创建一个单独的图形 window,这样循环的每次迭代都会为每个数量创建一个子图。

基本上,我希望我的代码执行如下操作:

import numpy as np
import matplotlib.pyplot as plt
nr = [10, 15, 20, 25, 35, 50]
fig1 = plt.figure(1)
fig2 = plt.figure(2)
for y in range(len(nr)):
        m = np.arange(y+1)
        n = (y+1)*np.arange(y+1)
        fig1.subplot(3,2,y+1)
        fig1.plot(m,n, 'b')
        fig1.title('y=%s'%y)

        m1 = np.square(np.arange(y+1))
        n1 = (y+1)*np.arange(y+1)
        fig2.subplot(3,2,y+1)
        fig2.plot(m1,n1, 'r')
        fig2.title('y=%s'%y)
fig1.show()
fig2.show()

此代码无效;给我 'Figure' 对象没有属性 'subplot' 的错误消息。我已经尝试了这个 link - http://matplotlib.org/api/pyplot_api.html 的许多变体,但我无法理解如何以正确的方式做到这一点。 在输出中,我想要两个图 windows,每个图都有 6 个子图,这样第一个包含 m 对 n 的图,第二个包含 m1 对 n1 的图。

好吧,解释很长,因为这里有多个问题。

您遇到的最大问题 运行 是在 matplotlib 中有多种处理方式。事实上,实际上有多个接口。最简单和最常用的方法是使用 pyplot 及其方法(如 pyplot.subplotpyplot.plot 来创建绘图。这适用于快速绘图,但不适用于您的情况。

由于您想创建两个图形并交替绘制这些图形,因此您将需要使用 pyplot 中功能更强大的对象。您自己完成了一部分,但我会尽力帮助您完成最后一部分。

你在这之前都很好:

import numpy as np
import matplotlib.pyplot as plt
nr = [10, 15, 20, 25, 35, 50]
fig1 = plt.figure(1)
fig2 = plt.figure(2)
for y in range(len(nr)):
    m = np.arange(y+1)
    n = (y+1)*np.arange(y+1)

但是当您尝试使用 Figure 的方法时,您会感到困惑并尝试使用属于 pyplot 的类似方法。下一部分应重写为:

    ax1 = fig1.add_subplot(3,2,y)
    ax1.plot(m,n, 'b')
    ax1.set_title('y=%s'%y)

    m1 = np.square(np.arange(y+1))
    n1 = (y+1)*np.arange(y+1)
    ax2 = fig2.add_subplot(3,2,y)
    ax2.plot(m1,n1, 'r')
    ax2.set_title('y=%s'%y)

在这里,您所做的是捕获从 add_subplot() 返回的 Axes 实例。然后你绘制到 Axes 实例上。此外,在指定要放置子图的位置时(Figure.add_subplot() 的第三个输入),您不想使用 y+1,因为那将从 1 开始并在 6 这将超出 0-5 的可用范围。请记住 Python 索引从零开始。

最后,要显示您刚刚创建的图形,您可以这样调用 pyplot.show()

plt.show()

或者您可以像这样将图形保存到文件中:

fig1.savefig('fig1.png')
fig2.savefig('fig2.png')

生成的数字如下所示: