복붙노트

[PYTHON] matplotlib을 사용하여 여러 서브 플로트에 대해 하나의 범례를 만드는 방법은 무엇입니까?

PYTHON

matplotlib을 사용하여 여러 서브 플로트에 대해 하나의 범례를 만드는 방법은 무엇입니까?

동일한 유형의 정보를 계획하고 있지만 다른 국가의 경우 matplotlib가있는 여러 개의 하위 플롯이 있습니다. 즉, 나는 3x3 그리드에 9 개의 플롯을 가지고 있는데, 모두 라인에 대해서 동일합니다 (물론 라인 당 다른 값).

그러나, 단 한 번의 전설을 쓰는 방법을 알아 내지 못했습니다 (모든 9 개의 하위 그림이 같은 선을 가짐).

어떻게해야합니까?

해결법

  1. ==============================

    1.figlegend가 당신이 찾고있는 것일 수 있습니다 : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend

    figlegend가 당신이 찾고있는 것일 수 있습니다 : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend

    여기 예제 : http://matplotlib.org/examples/pylab_examples/figlegend_demo.html

    다른 예시:

    plt.figlegend( lines, labels, loc = 'lower center', ncol=5, labelspacing=0. )
    

    또는:

    fig.legend( lines, labels, loc = (0.5, 0), ncol=5 )
    
  2. ==============================

    2.또한 label = arguments에서 필요한 모든 것을 수집 할 수있는 마지막 축에서 호출 할 수있는 좋은 함수 get_legend_handles_labels ()가 있습니다 (반복하는 경우).

    또한 label = arguments에서 필요한 모든 것을 수집 할 수있는 마지막 축에서 호출 할 수있는 좋은 함수 get_legend_handles_labels ()가 있습니다 (반복하는 경우).

    handles, labels = ax.get_legend_handles_labels()
    fig.legend(handles, labels, loc='upper center')
    
  3. ==============================

    3.루프 밖에서 한 번만 범례를 요구해야합니다.

    루프 밖에서 한 번만 범례를 요구해야합니다.

    예를 들어이 경우에는 동일한 줄과 단일 범례가있는 4 개의 하위 그림이 있습니다.

    from matplotlib.pyplot import *
    
    ficheiros = ['120318.nc', '120319.nc', '120320.nc', '120321.nc']
    
    fig = figure()
    fig.suptitle('concentration profile analysis')
    
    for a in range(len(ficheiros)):
        # dados is here defined
        level = dados.variables['level'][:]
    
        ax = fig.add_subplot(2,2,a+1)
        xticks(range(8), ['0h','3h','6h','9h','12h','15h','18h','21h']) 
        ax.set_xlabel('time (hours)')
        ax.set_ylabel('CONC ($\mu g. m^{-3}$)')
    
        for index in range(len(level)):
            conc = dados.variables['CONC'][4:12,index] * 1e9
            ax.plot(conc,label=str(level[index])+'m')
    
        dados.close()
    
    ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.)
             # it will place the legend on the outer right-hand side of the last axes
    
    show()
    
  4. ==============================

    4.서브 그래프 ()로 얻은 것과 같이 축이 많은 그림에서 단일 범례를 자동으로 배치하려면 다음 솔루션이 실제로 잘 작동합니다.

    서브 그래프 ()로 얻은 것과 같이 축이 많은 그림에서 단일 범례를 자동으로 배치하려면 다음 솔루션이 실제로 잘 작동합니다.

    plt.legend( lines, labels, loc = 'lower center', bbox_to_anchor = (0,-0.1,1,1),
                bbox_transform = plt.gcf().transFigure )
    

    bbox_to_anchor와 bbox_transform = plt.gcf (). transFigure를 사용하여 loc의 참조가되는 그림 크기의 새 경계 상자를 정의합니다. (0, -0.1,1,1)을 사용하면이 bouding 상자를 약간 아래쪽으로 움직여 범례가 다른 아티스트 위에 놓이지 않도록 할 수 있습니다.

    OBS : fig.set_size_inches ()를 사용하고 fig.tight_layout ()을 사용하기 전에이 솔루션을 사용하십시오.

  5. ==============================

    5.게임에 다소 늦은 동안, 나는 여전히 구글에 나타나는 첫 번째 링크 중 하나이기 때문에 여기에 또 다른 해결책을 제시 할 것입니다. matplotlib 2.2.2를 사용하면 gridspec 기능을 사용하여이 작업을 수행 할 수 있습니다. 아래의 예에서 목표는 4x2 개의 서브 플로트를 2x2 형식으로 배치하고 하단에 범례를 표시하는 것입니다. 범례를 고정 된 위치에 배치하기 위해 '가짜'축이 아래쪽에 만들어집니다. 그런 다음 '가짜'축이 해제되어 전설 만 표시됩니다. 결과 : https://i.stack.imgur.com/5LUWM.png.

    게임에 다소 늦은 동안, 나는 여전히 구글에 나타나는 첫 번째 링크 중 하나이기 때문에 여기에 또 다른 해결책을 제시 할 것입니다. matplotlib 2.2.2를 사용하면 gridspec 기능을 사용하여이 작업을 수행 할 수 있습니다. 아래의 예에서 목표는 4x2 개의 서브 플로트를 2x2 형식으로 배치하고 하단에 범례를 표시하는 것입니다. 범례를 고정 된 위치에 배치하기 위해 '가짜'축이 아래쪽에 만들어집니다. 그런 다음 '가짜'축이 해제되어 전설 만 표시됩니다. 결과 : https://i.stack.imgur.com/5LUWM.png.

    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    
    #Gridspec demo
    fig = plt.figure()
    fig.set_size_inches(8,9)
    fig.set_dpi(100)
    
    rows   = 17 #the larger the number here, the smaller the spacing around the legend
    start1 = 0
    end1   = int((rows-1)/2)
    start2 = end1
    end2   = int(rows-1)
    
    gspec = gridspec.GridSpec(ncols=4, nrows=rows)
    
    axes = []
    axes.append(fig.add_subplot(gspec[start1:end1,0:2]))
    axes.append(fig.add_subplot(gspec[start2:end2,0:2]))
    axes.append(fig.add_subplot(gspec[start1:end1,2:4]))
    axes.append(fig.add_subplot(gspec[start2:end2,2:4]))
    axes.append(fig.add_subplot(gspec[end2,0:4]))
    
    line, = axes[0].plot([0,1],[0,1],'b')           #add some data
    axes[-1].legend((line,),('Test',),loc='center') #create legend on bottommost axis
    axes[-1].set_axis_off()                         #don't show bottommost axis
    
    fig.tight_layout()
    plt.show()
    
  6. ==============================

    6.이 답변은 전설 위치에있는 @ Evert의 보완책입니다.

    이 답변은 전설 위치에있는 @ Evert의 보완책입니다.

    전설과 서브 플롯의 제목이 겹쳐서 @ Evert의 솔루션에 대한 첫 번째 시도가 실패했습니다.

    사실, 겹치기는 그림 범례를 고려하지 않고 하위 그림의 레이아웃을 변경하는 fig.tight_layout ()에 의해 발생합니다. 그러나, fig.tight_layout ()이 필요합니다.

    겹침을 피하기 위해 fig.tight_layout (rect = (0,0,1,0.9))을 사용하여 fig.tight_layout ()에 그림 범례의 공백을 남기도록 지시 할 수 있습니다.

    tight_layout () 파라미터의 설명.

  7. from https://stackoverflow.com/questions/9834452/how-do-i-make-a-single-legend-for-many-subplots-with-matplotlib by cc-by-sa and MIT license