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

时间:2015-02-18 00:54:01

标签: python matplotlib

我想在循环中绘制两个单独的数量。我想为每个数量创建一个单独的图形窗口,这样循环的每次迭代都会为每个数量创建一个子图。

基本上,我希望我的代码能做到这样的事情:

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

这段代码不起作用;给我一个错误信息'图'对象没有属性' subplot'。我在此链接上尝试了很多变体 - http://matplotlib.org/api/pyplot_api.html,但我无法理解如何以正确的方式执行此操作。 在输出中,我想要两个图形窗口,每个窗口有6个子图,这样第一个包含m对n的图,第二个包含m1对n1的图。

1 个答案:

答案 0 :(得分:2)

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

您遇到的最大问题是有多种方法可以处理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)

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

最后,为了显示您刚创建的数据,您可以像这样调用6

pyplot.show()

或者你可以将数字保存到这样的文件:

plt.show()

结果数字如下:

fig1

fig2