通过函数循环绘制几个子图,Python

时间:2015-12-03 13:27:10

标签: python function python-2.7 matplotlib subplot

我有变量xy

def function(a,b):
    x = x[(x>a)*(x<b)]
    y = y[(y<a)*(y>b)]

    # perform some fitting routine using curve_fit on x and y

    fig = plt.figure()
    ax = fig.add_subplot(111)
    phist,xedge,yedge,img = ax.hist2d(x,y,bins=20,norm=LogNorm())
    im = ax.imshow(phist,cmap=plt.cm.jet,norm=LogNorm(),aspect='auto')
    fig.colorbar(im,ax=ax)
    fig.show()

一切正常。但我有6对不同的输入参数ab。我想以某种方式使用循环调用function(a,b)并将六个不同的xy (对应于6个输入对)绘制为6个子图。< / strong>

像我们一样

ax1 = fig.add_subplot(231) # x vs y for a1,b1
ax2 = fig.add_subplot(232) # x vs y for a2,b2
....
ax6 = fig.add_subplot(236) # x vs y for a6,b6

我想知道如何进行最终的子情节!

我知道可以通过为第一个输入对x1y1指定不同的变量来手动完成,例如ab,以此类推6对(x2,y2...,x6,y6)。但这将是一个非常冗长和令人困惑的代码。

2 个答案:

答案 0 :(得分:2)

使用plt.subplots代替plt.subplot(请注意末尾的“s”)。 fig, axs = plt.subplots(2, 3)将创建一个包含2x3子图组的图形,其中fig是图形,axs是2x3 numpy数组,其中每个元素是与轴对应的轴对象图中的位置(所以axs[1, 2]是右下轴)。

然后,您可以使用一对循环遍历每一行,然后遍历该行中的每个轴:

fig, axs = plt.subplots(2, 3)
for i, row in enumerate(axs):
   for j, ax in enumerate(row):
       ax.imshow(foo[i, j])
fig.show()

或者您可以使用ravel展平行以及您想要获取数据的任何内容:

fig, axs = plt.subplots(2, 3)
foor = foo.ravel()
for i, ax in enumerate(axs.ravel()):
    ax.imshow(foor[i])
fig.show()

请注意ravel是一个视图,而不是副本,因此不会占用任何额外的内存。

答案 1 :(得分:1)

关键是使用子图的三参数形式:

import matplotlib.pyplot as plt

# Build a list of pairs for a, b
ab = zip(range(6), range(6))

#iterate through them
for i, (a, b) in enumerate(ab):
    plt.subplot(2, 3, i+1)
    #function(a, b)
    plt.plot(a, b)

plt.show()

你只需要从函数中调用figure