2013-08-22 9 views
5

में डेटा की एनोटेटिंग श्रेणियां मैं अपने डेटा की एक श्रृंखला को कैसे एनोटेट कर सकता हूं? उदाहरण के लिए, x = 5 से x = 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