[PYTHON] matplotlib을 사용하여 여러 서브 플로트에 대해 하나의 범례를 만드는 방법은 무엇입니까?
PYTHONmatplotlib을 사용하여 여러 서브 플로트에 대해 하나의 범례를 만드는 방법은 무엇입니까?
동일한 유형의 정보를 계획하고 있지만 다른 국가의 경우 matplotlib가있는 여러 개의 하위 플롯이 있습니다. 즉, 나는 3x3 그리드에 9 개의 플롯을 가지고 있는데, 모두 라인에 대해서 동일합니다 (물론 라인 당 다른 값).
그러나, 단 한 번의 전설을 쓰는 방법을 알아 내지 못했습니다 (모든 9 개의 하위 그림이 같은 선을 가짐).
어떻게해야합니까?
해결법
-
==============================
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.또한 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.루프 밖에서 한 번만 범례를 요구해야합니다.
루프 밖에서 한 번만 범례를 요구해야합니다.
예를 들어이 경우에는 동일한 줄과 단일 범례가있는 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.서브 그래프 ()로 얻은 것과 같이 축이 많은 그림에서 단일 범례를 자동으로 배치하려면 다음 솔루션이 실제로 잘 작동합니다.
서브 그래프 ()로 얻은 것과 같이 축이 많은 그림에서 단일 범례를 자동으로 배치하려면 다음 솔루션이 실제로 잘 작동합니다.
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.게임에 다소 늦은 동안, 나는 여전히 구글에 나타나는 첫 번째 링크 중 하나이기 때문에 여기에 또 다른 해결책을 제시 할 것입니다. 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.이 답변은 전설 위치에있는 @ Evert의 보완책입니다.
이 답변은 전설 위치에있는 @ Evert의 보완책입니다.
전설과 서브 플롯의 제목이 겹쳐서 @ Evert의 솔루션에 대한 첫 번째 시도가 실패했습니다.
사실, 겹치기는 그림 범례를 고려하지 않고 하위 그림의 레이아웃을 변경하는 fig.tight_layout ()에 의해 발생합니다. 그러나, fig.tight_layout ()이 필요합니다.
겹침을 피하기 위해 fig.tight_layout (rect = (0,0,1,0.9))을 사용하여 fig.tight_layout ()에 그림 범례의 공백을 남기도록 지시 할 수 있습니다.
tight_layout () 파라미터의 설명.
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
'PYTHON' 카테고리의 다른 글
[PYTHON] 별도의 팬더 데이터 프레임을 서브 그림으로 플로팅하려면 어떻게해야합니까? (0) | 2018.10.10 |
---|---|
[PYTHON] __file__ 변수는 무엇을 의미합니까 /할까요? (0) | 2018.10.10 |
[PYTHON] pytest의 PATH 문제 'ImportError : 모듈 이름이 YadaYadaYada' (0) | 2018.10.10 |
[PYTHON] 파이썬에서 문자열의 끝에서 부분 문자열을 어떻게 제거합니까? (0) | 2018.10.10 |
[PYTHON] "R-essentials"에서 사용할 수없는 R 패키지를 설치하는 방법은 무엇입니까? (0) | 2018.10.10 |