【问题标题】:Looping through a function to plot several subplots, Python循环通过一个函数来绘制几个子图,Python
【发布时间】:2016-03-08 03:25:00
【问题描述】:

我有变量 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 个子图。

像我们一样

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)。但这将是一个非常冗长且令人困惑的代码。

【问题讨论】:

    标签: python function python-2.7 matplotlib subplot


    【解决方案1】:

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

    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 退出函数即可。

    【讨论】:

    • 你能详细说明一下吗?
    • 我已将答案更改为完全独立,并在 ab 的配对列表上进行操作。这段代码在我的机器上运行良好。您可以评论 plt.plot 并替换 function 调用我已将其评论。
    【解决方案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 是一个视图,而不是一个副本,所以这不会占用任何额外的内存。

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2021-07-22
      • 1970-01-01
      • 2013-10-11
      • 2021-10-01
      相关资源
      最近更新 更多