2017-04-12 73 views
2

在Seaborn barplot中,我想用箭頭標註列。現在,當我看到這似乎有點挑剔,我真的很喜歡那個箭頭如何在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