범례 배치 ( bbox_to_anchor
)
범례는에 loc
인수를 사용하여 축의 경계 상자 안에 배치 됩니다 plt.legend
.
예는 loc="upper right"
경계 상자의 오른쪽 상단 모서리에 범례를 배치하는 기본 범위에 의해에서 (0,0)
에 (1,1)
축 좌표 (또는 상자 표기 경계에서 (x0,y0, width, height)=(0,0,1,1)
).
좌표축 경계 상자 외부에 범례를 배치하려면 범례 (x0,y0)
왼쪽 아래 모서리의 좌표축 튜플 을 지정할 수 있습니다 .
plt.legend(loc=(1.04,0))
그러나보다 다양한 접근 방식은 bbox_to_anchor
인수를 사용하여 범례를 배치 할 경계 상자를 수동으로 지정하는 것 입니다. (x0,y0)
bbox 의 일부만 공급하도록 스스로를 제한 할 수 있습니다 . 이렇게하면 범례 상자가 만들어지고 범례가 loc
인수에 지정된 방향으로 확장됩니다 . 예 :
plt.legend (bbox_to_anchor = (1.04,1), loc = "왼쪽 상단")
범례의 왼쪽 위 모서리가 (1.04,1)
축 좌표의 위치 에 있도록 범례를 축 외부에 배치 합니다.
추가적으로 다른 인자 사이의 상호 작용이 같은 곳에 추가의 예는 이하와 같다 mode
과 ncols
같다.
l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right",
bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")
에서 bbox_to_anchor
와 같이 4- 튜플 인수를 해석하는 방법에 대한 자세한 내용 l4
은 이 질문 에서 찾을 수 있습니다 . 는 mode="expand"
4 튜플 주어진 바운딩 박스 내에 수평으로 범례를 확장한다. 수직 확장 범례에 대해서는 이 질문을 참조하십시오 .
축 좌표 대신 그림 좌표에서 경계 상자를 지정하는 것이 유용한 경우도 있습니다. 이것은 l5
위 의 예 에서 볼 수 있는데, bbox_transform
인수는 그림의 왼쪽 아래 구석에 범례를 넣는 데 사용됩니다.
후 처리
범례를 축 외부에 배치하면 원치 않는 부분이 그림 캔버스 외부에있는 경우가 종종 있습니다.
이 문제에 대한 해결책은 다음과 같습니다.
서브 플롯 매개 변수 조정 서브 플롯 매개 변수
를 조정하여을 사용하여 축이 그림 내부의 공간을 덜 차지하므로 범례에 더 많은 공간을 남겨 둘 수 plt.subplots_adjust
있습니다. 예 :
plt.subplots_adjust(right=0.7)
그림의 오른쪽에 30 %의 공간을 남겨두고 전설을 배치 할 수 있습니다.
꽉 레이아웃
사용 plt.tight_layout
그림의 요소가 그림 가장자리에 꽉 맞도록 서브 플롯 매개 변수를 자동으로 조정할 수 있습니다. 불행히도 범례는이 자동화에서 고려되지 않지만 레이블을 포함하여 전체 하위 플롯 영역에 맞는 사각형 상자를 제공 할 수 있습니다.
plt.tight_layout(rect=[0,0,0.75,1])
그림을bbox_inches = "tight"
인수 bbox_inches = "tight"
로 plt.savefig
저장 캔버스에있는 모든 아티스트 (범례 포함)가 저장된 영역에 맞도록 그림을 저장하는 데 사용할 수 있습니다. 필요한 경우 도형 크기가 자동으로 조정됩니다.
plt.savefig("output.png", bbox_inches="tight")
- 자동으로 부가 적 줄거리를 PARAMS 조정
캔버스 내부의 전설 적합하도록 자동으로 부가 적 줄거리의 위치를 조정하는 방법 그림 크기를 변경하지 않고는 이 대답에서 찾을 수 있습니다 (축 외부 전설) 정확한 크기와 패딩 그림 만들기
위에서 논의 된 사례들 간의 비교 :
대안
그림 범례
축 대신 그림에 범례를 사용할 수 있습니다 matplotlib.figure.Figure.legend
. 이것은 특별한 인수가 필요하지 않은 matplotlib 버전> = 2.1에 특히 유용합니다.
fig.legend(loc=7)
그림의 다른 축에있는 모든 아티스트의 범례를 만들 수 있습니다. 범례는 loc
축 내부에 배치되는 방식과 유사하지만 인수 전체를 참조 하여 인수를 사용하여 배치되므로 축 외부에 다소 자동으로 배치됩니다. 남아있는 것은 범례와 축이 겹치지 않도록 서브 플롯을 조정하는 것입니다. 여기에서 "서브 플롯 매개 변수 조정" 이 도움이 될 것입니다. 예를 들면 :
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))
fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)
plt.show()
전용 서브 플롯 축 내부의 범례
사용하는 대안 bbox_to_anchor
은 전용 서브 플롯 축 ( lax
)에 범례를 배치하는 것 입니다. 범례 서브 플롯은 플롯보다 작아야하므로 gridspec_kw={"width_ratios":[4,1]}
축을 만들 때 사용할 수 있습니다 . 우리는 축을 숨길 수는 lax.axis("off")
있지만 여전히 범례를 넣을 수 있습니다 . 범례 핸들과 레이블은을 통해 실제 플롯에서 얻어야 h,l = ax.get_legend_handles_labels()
하고 lax
서브 플롯 의 범례에 제공 될 수 있습니다 lax.legend(h,l)
. 완전한 예는 다음과 같습니다.
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2
fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....
h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")
plt.tight_layout()
plt.show()
이것은 위의 플롯과 시각적으로 매우 유사한 플롯을 생성합니다.
첫 번째 축을 사용하여 범례를 배치 할 수도 있지만 bbox_transform
범례 축을 사용하여
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
이 방법에서는 범례 핸들을 외부에서 얻을 필요는 없지만 bbox_to_anchor
인수 를 지정해야합니다 .
추가 자료 및 참고 사항 :
- 범례 와 함께하고 싶은 다른 것들의 일부 예제와 함께 matplotlib 범례 가이드 를 고려하십시오 .
- 파이 차트에 범례를 배치하는 예제 코드는이 질문에 대한 답변에서 직접 찾을 수 있습니다. Python-범례가 파이 차트와 겹칩니다
loc
인수는하지만, 그들은 매우 직관적으로 서로 매핑되지 않는 통화는 짧게 숫자 대신 문자열을 취할 수 있습니다. 다음은 참조 용 매핑입니다.