2013-08-22 88 views
5

如何註釋我的一系列數據?例如,假設從x = 5x = 10的數據大於某個截止點,我怎麼能在圖上表明這一點。如果我是手工註釋,我會在範圍上方畫一個大支架,並在支架上面寫上我的註釋。在matplotlib中註釋數據範圍

我看到的最接近的方法是使用arrowstyle='<->'connectionstyle='bar',使兩個箭頭指向數據邊緣並用連線連接它們的尾部。但這並不是正確的做法;您爲註釋輸入的文本將在箭頭之下結束,而不是在條形上方。

這裏是我的嘗試,它的結果一起:

annotate(' ', xy=(1,.5), xycoords='data', 
      xytext=(190, .5), textcoords='data', 
      arrowprops=dict(arrowstyle="<->", 
          connectionstyle="bar", 
          ec="k", 
          shrinkA=5, shrinkB=5, 
          ) 
      ) 

Annotation attempt

我試圖解決的另一個問題是,標註支架的田字並沒有真正說清楚,我突出顯示範圍(不同於例如大括號)。但是,我認爲在這一點上這只是個挑剔。

+0

使用兩種註解,一個有文字,但沒有箭頭,一個帶箭頭,但沒有文本。另請參閱'axvspan' http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.axvspan – tacaswell

+0

也最好顯示您嘗試過的內容(使用代碼段)。 – tacaswell

+0

@tcaswell我想過使用兩個註釋,但是這涉及手動定位文本,並且如果範圍移動,必須手動更新兩個註釋。看起來這是一個普遍存在的問題,即存在更優化的解決方案。 – ari

回答

4

你可以只是包裝了這一切的功能:

def add_range_annotation(ax, start, end, txt_str, y_height=.5, txt_kwargs=None, arrow_kwargs=None): 
    """ 
    Adds horizontal arrow annotation with text in the middle 

    Parameters 
    ---------- 
    ax : matplotlib.Axes 
     The axes to draw to 

    start : float 
     start of line 

    end : float 
     end of line 

    txt_str : string 
     The text to add 

    y_height : float 
     The height of the line 

    txt_kwargs : dict or None 
     Extra kwargs to pass to the text 

    arrow_kwargs : dict or None 
     Extra kwargs to pass to the annotate 

    Returns 
    ------- 
    tuple 
     (annotation, text) 
    """ 

    if txt_kwargs is None: 
     txt_kwargs = {} 
    if arrow_kwargs is None: 
     # default to your arrowprops 
     arrow_kwargs = {'arrowprops':dict(arrowstyle="<->", 
          connectionstyle="bar", 
          ec="k", 
          shrinkA=5, shrinkB=5, 
          )} 

    trans = ax.get_xaxis_transform() 

    ann = ax.annotate('', xy=(start, y_height), 
         xytext=(end, y_height), 
         transform=trans, 
         **arrow_kwargs) 
    txt = ax.text((start + end)/2, 
        y_height + .05, 
        txt_str, 
        **txt_kwargs) 


    if plt.isinteractive(): 
     plt.draw() 
    return ann, txt 

或者,

start, end = .6, .8 
ax.axvspan(start, end, alpha=.2, color='r') 
trans = ax.get_xaxis_transform() 
ax.text((start + end)/2, .5, 'test', transform=trans) 
+0

獲得自己的方法不是一種常見的操作? – ari

+0

我不知道現有的,但我只寫了一個;)如果你可以提供一些反饋使用的東西,我會建議添加到圖書館作爲內置。 – tacaswell

+0

他們都是很好的選擇,感謝您分享它們。您提供的功能已經足夠滿足大多數情況,但如果您正在尋找改進方法,我可以考慮一些建議。 – ari