2017-09-07 19 views
1

아래와 같이 서로 부딪히지 않도록 errorplars의 높이를 matplotlib 범례에 표시된대로 조정하고 싶습니다.Matplotlib : 범례에서 오차 막대의 크기/높이 조절

오류 막대를 제거하는 방법을 설명하는이 게시물 Matplotlib: Don't show errorbars in legend을 알고 있지만 오류 막대가 여전히 짧아 지도록 처리기를 조정하는 방법을 알지 못합니다. 내가하기 matplotlib의 버전 1.5.1을 사용하고

import matplotlib 
font = {'family' : 'serif', 
    'serif': 'Computer Modern Roman', 
    'weight' : 'medium', 
    'size' : 19} 
matplotlib.rc('font', **font) 
matplotlib.rc('text', usetex=True) 

fig,ax1=plt.subplots() 
h0=ax1.errorbar([1,2,3],[1,2,3],[1,2,1],c='b',label='$p=5$') 
h1=ax1.errorbar([1,2,3],[3,2,1],[1,1,1],c='g',label='$p=5$') 
hh=[h0,h1] 
ax1.legend(hh,[H.get_label() for H in hh],bbox_to_anchor=(0.02, 0.9, 1., .102),loc=1,labelspacing=0.01, handlelength=0.14, handletextpad=0.4,frameon=False, fontsize=18.5) 

,하지만 난 그 문제 있다고 생각하지 않는다 : 중복 errorbars와

Error bars

동작하는 예제 입니다.

+0

기본적으로 범례 항목 사이에는 충분한 간격이 있어야합니다. 전설은 [이와 같이] 보일 것입니다 (https://i.stack.imgur.com/yQr0V.png). 기본 설정에 비해 무엇이 변경 되었습니까? 도움이 필요하면 문제가있는 코드의 [mcve]를 제공해야합니다 (사용중인 matplotlib의 버전도 명확하게 기술해야합니다). – ImportanceOfBeingErnest

+0

감사합니다. 전설의 구석에 범례를 집어 넣고 있기 때문에 범례에 labelspacing 키워드를 사용해야했습니다. 지금 코드 게시. – mzzx

답변

1

범례 핸들을 제어하려면 handler_map kwarg ~ ax.legend을 사용할 수 있습니다.

이 경우 matplotlib.legend_handler에서 HandlerErrorbar 처리기를 사용하고 xerr_size 옵션을 설정하려고합니다. 기본적으로이 값은 0.5이므로이 값을 줄거리에 적합한 값으로 줄여야합니다.

the legend guide에서 안내를 받으면 handler_map을 사용하는 방법을 볼 수 있습니다. 단지 errorbar 핸들 중 하나를 변경하려면, 우리는이 작업을 수행 할 수 있습니다 :

handler_map={h0: HandlerErrorbar(xerr_size=0.3)} 

을 당신이 errorbar 모두 같은 방식으로 처리 변경하려는 가정하면, 변경할 수 있습니다 h0type(h0)에 :

handler_map={type(h0): HandlerErrorbar(xerr_size=0.3)} 

이는 handler_map 모두를 변경하는 방법을 알려주는 바로 빠른 방법 일뿐입니다. Errorbars. 이 다음을 수행하는 것과 같습니다 것을 참고 : type(h0) 속기를 사용

from matplotlib.container import ErrorbarContainer 
... 
ax1.legend(... 
    handler_map={ErrorbarContainer: HandlerErrorbar(xerr_size=0.3)} 
    ...) 

당신이 ErrorbarContainer의 추가 수입을 할 필요가 없습니다 의미합니다.

당신의 최소한의 예에서 함께이 퍼팅 :

: 나는 errorbar 크기를 조정하기 전에

import matplotlib 
import matplotlib.pyplot as plt 

# Import the handler 
from matplotlib.legend_handler import HandlerErrorbar 

font = {'family' : 'serif', 
    'serif': 'Computer Modern Roman', 
    'weight' : 'medium', 
    'size' : 19} 
matplotlib.rc('font', **font) 
matplotlib.rc('text', usetex=True) 

fig,ax1=plt.subplots() 
h0=ax1.errorbar([1,2,3],[1,2,3],[1,2,1],c='b',label='$p=5$') 
h1=ax1.errorbar([1,2,3],[3,2,1],[1,1,1],c='g',label='$p=5$') 
hh=[h0,h1] 
ax1.legend(
     hh, [H.get_label() for H in hh], 
     handler_map={type(h0): HandlerErrorbar(xerr_size=0.3)}, # adjust xerr_size to suit the plot 
     bbox_to_anchor=(0.02, 0.9, 1., .102), 
     loc=1, labelspacing=0.01, 
     handlelength=0.14, handletextpad=0.4, 
     frameon=False, fontsize=18.5) 

plt.show() 
이 근무하고 증거를 들어

enter image description here

, 당신은, 원본 이미지에이를 비교할 수 있습니다 enter image description here

+0

감사합니다. 위대한 작품이며 매우 유용합니다! 그냥 이해합니다. 유형 (h0)은 무엇을합니까? 나는 그것이 모든 오류 표시 줄을 변경한다는 것을 이해합니다 -하지만 왜? 그것은 타입 (h0)의 모든 핸들러를 의미합니까? – mzzx

+0

예,'type (h0)'은'matplotlib.container '입니다.ErrorbarContainer', 그래서 기본적으로 모든'ErrorbarContainer'를 같은 방식으로 제어하려고합니다. 나는 내 대답에 그것을 더 명확하게 할 것이다 ... – tom

+0

그래, 알았어. 설명에 많은 감사드립니다 !! – mzzx