代码之家  ›  专栏  ›  技术社区  ›  Dr proctor

在单个循环中使用子图绘制多个图形

  •  4
  • Dr proctor  · 技术社区  · 8 年前

    fig, ax = plt.subplots(nrows=6,ncols=6,figsize=(20, 20))
    fig.subplots_adjust(hspace=.5,wspace=0.4)
    plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
    
    for x in range(1,32):
        plt.subplot(6,6,x)
        plt.title('day='+str(x))
        plt.scatter(x1,y1)
        plt.scatter(x2,y2)
        plt.colorbar().set_label('Distance from ocean',rotation=270)
    plt.savefig('Plots/everyday_D color.png')    
    plt.close()
    

    现在我知道,当你有多个数字时,你需要这样做:

    fig1, ax1 = plt.subplots()
    fig2, ax2 = plt.subplots()
    

    但是我不知道如何在循环中绘制,每个子图都在它的位置上(因为如果有两个图,你就不能继续做plt.scatter)。请具体说明我需要做什么(关于它是否为fig1.scatter、ax1.scatter、fig.subplots\u adjust,…以及如何在最后保存和关闭)

    2 回复  |  直到 8 年前
        1
  •  4
  •   ImportanceOfBeingErnest    8 年前

    在面向对象的API中,每个pyplot函数都有其相应的方法。如果您真的想同时在两个图形的轴上循环,则如下所示:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x1 = x2 = np.arange(10)
    y1 = y2 = c = np.random.rand(10,6)
    
    fig1, axes1 = plt.subplots(nrows=2,ncols=3)
    fig1.subplots_adjust(hspace=.5,wspace=0.4)
    
    fig2, axes2 = plt.subplots(nrows=2,ncols=3)
    fig2.subplots_adjust(hspace=.5,wspace=0.4)
    
    for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())):
        ax1.set_title('day='+str(i))
        ax2.set_title('day='+str(i))
        sc1 = ax1.scatter(x1,y1[:,i], c=c[:,i])
        sc2 = ax2.scatter(x2,y2[:,i], c=c[:,i])
        fig1.colorbar(sc1, ax=ax1)
        fig2.colorbar(sc2, ax=ax2)
    
    plt.savefig("plot.png") 
    plt.show()   
    plt.close()
    

    在这里,你在两个扁平轴阵列上循环,这样 ax1 ax2 matplotlib axes 绘制到。 fig1 fig2 matplotlib.figure.Figure ).

    为了获得索引, enumerate 已使用。所以这条线

    for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())):
        # loop code
    

    for i in range(6):
        ax1 = axes1.flatten()[i]
        ax2 = axes2.flatten()[i]
        # loop code
    

    i = 0
    for ax1,ax2 in zip(axes1.flatten(), axes2.flatten()):
        # loop code
        i += 1
    

    它们都写得更长。

    此时,您可能会感兴趣的是,尽管上述使用面向对象API的解决方案肯定更通用、更可取,但纯pyplot解决方案仍然是可能的。这看起来像

    import numpy as np
    import matplotlib.pyplot as plt
    
    x1 = x2 = np.arange(10)
    y1 = y2 = c = np.random.rand(10,6)
    
    plt.figure(1)
    plt.subplots_adjust(hspace=.5,wspace=0.4)
    
    plt.figure(2)
    plt.subplots_adjust(hspace=.5,wspace=0.4)
    
    for i in range(6):
        plt.figure(1)
        plt.subplot(2,3,i+1)
        sc1 = plt.scatter(x1,y1[:,i], c=c[:,i])
        plt.colorbar(sc1)
    
        plt.figure(2)
        plt.subplot(2,3,i+1)
        sc2 = plt.scatter(x1,y1[:,i], c=c[:,i])
        plt.colorbar(sc2)
    
    plt.savefig("plot.png") 
    plt.show()   
    plt.close()
    
        2
  •  1
  •   Eric    8 年前

    plt.subplots .

    import matplotlib.pyplot as plt
    import numpy as np
    
    x1 = y1 = range(10)
    x2 = y2 = range(5)
    
    nRows = nCols = 6
    fig1, axesArray1 = plt.subplots(nrows=nRows,ncols=nCols,figsize=(20, 20))
    fig1.subplots_adjust(hspace=.5,wspace=0.4)
    fig1.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
    
    fig2, axesArray2 = plt.subplots(nrows=nRows,ncols=nCols,figsize=(20, 20))
    fig2.subplots_adjust(hspace=.5,wspace=0.4)
    fig2.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
    
    days = range(1, 32)
    dayRowCol = np.array([i + 1 for i in range(nRows * nCols)]).reshape(nRows, nCols)
    for day in days:
        rowIdx, colIdx = np.argwhere(dayRowCol == day)[0]
    
        axis1 = axesArray1[rowIdx, colIdx]
        axis1.set_title('day=' + str(day))
        axis1.scatter(x1, y1)
    
        axis2 = axesArray2[rowIdx, colIdx]
        axis2.set_title('day=' + str(day))
        axis2.scatter(x2, y2)
    
        # This didn't run in the original script, so I left it as is
        # plt.colorbar().set_label('Distance from ocean',rotation=270)
    
    fig1.savefig('plots/everyday_D1_color.png')
    fig2.savefig('plots/everyday_D2_color.png')
    plt.close('all')
    

    当我从邮件中获取原始代码时 plt.colorbar() colorbar 我们可以看看如何实现这两个数字,但代码的其余部分应该按预期工作!

    day 每个不出现在 dayRolCol numpy会出现错误,由您决定如何处理该案例。此外,使用numpy绝对不是唯一的方法,只是一种我很熟悉的方法-你真正需要做的就是找到一种方法,将某一天/图与你想要绘制的轴的(x,y)索引联系起来。

    推荐文章