2017-04-12 1 views
2

Seaborn 바브롯에서 화살표로 열에 주석을 추가하려고합니다. 나는이 조금 안목을 보일 수있는 방법을 참조하면서 이제, 정말 모두matplotlib에서 열기 및 확대 화살표 머리를 얻는 방법

  1. 에 그 화살표 하시겠습니까는 열기 머리를 (머리로 즉,하지 폐쇄 삼각형 만이 개방 라인을 가지고) 및
  2. 그림을 크기를 조정할 때.

나는 화살합니다 (arrowannotate 방법)을 추가하는 두 가지하기 matplotlib의 방법을 발견하지만, 각각의 하나는 이러한 기능 중 하나 부족한 것 같다.

import seaborn as sns 

sns.plt.subplot(121) 
ax = sns.barplot(("x", "y", "z"), (1, 4, 7)) 
# head is not open 
ax.arrow(0, 5, 0., -3.5, lw=1, fill=False, 
     head_length=.5, head_width=.2, 
     length_includes_head=True) 

sns.plt.subplot(122) 
ax = sns.barplot(("x", "y", "z"), (1, 4, 7)) 
# head does not scale with figure 
ax.annotate("", xytext=(0, 5), xy=(0, 1.5), 
      arrowprops=dict(arrowstyle="->, head_length = 2, head_width = .5", lw=1)) 

sns.plt.show() 

왼쪽 화살표의 머리가 (추한) 폐쇄,하지만 난 그림 (머리 크기가 데이터 단위이기 때문에, 나는 가정을) 크기를 조정할 때 그것을 잘 확장 :이 코드는 옆에 양쪽을 나타내는. 오른쪽 화살표의 머리는 멋있고 열려 있지만 그림 크기와 상관없이 항상 동일한 픽셀 크기를 유지합니다.

Right arrow head too big

을 내가 그림 더 할 때, 오른쪽 화살표 머리가된다 - 상대적으로 - 작은이, 왼쪽 화살표 머리가 잘 확장하면서 : 그래서 그림이 작은 경우, 오른쪽 화살표 머리가 상대적으로 큰 같습니다 :

Right arrow head too small

그래서, 오픈 스케일링 화살표 머리를하는 방법은 무엇입니까?

답변

2

가장 중요한 것은 overhang 인수를 사용하고 1 또는 그와 가까운 값으로 설정하는 것입니다.

import matplotlib.pyplot as plt 

fig, ax = plt.subplots(figsize=(4,4)) 

v = [-0.2, 0, .2, .4, .6, .8, 1] 
for i, overhang in enumerate(v): 
    ax.arrow(.1,overhang,.6,0, width=0.001, color="k", 
      head_width=0.1, head_length=0.15, overhang=overhang) 

ax.set_yticks(v) 
ax.set_xticks([]) 
ax.set_ylabel("overhang") 
ax.set_ylim(-0.3,1.1) 
plt.tight_layout() 
plt.show() 

enter image description here