2013-08-22 11 views
5

Jak mogę dodać adnotacje do zakresu moich danych? Np. Dane od x = 5 do x = 10 są większe niż niektóre wartości odcięcia, jak mogę to zaznaczyć na wykresie. Gdybym robił notatki ręcznie, po prostu rysowałbym duży nawias powyżej zakresu i zapisywał moją adnotację nad nawiasem.Dodawanie zakresów adnotacji danych w matplotlib

Najbliższe, jakie widziałem, to używanie arrowstyle='<->' i connectionstyle='bar', aby dwie strzałki wskazywały na krawędzie danych linią łączącą ich ogony. Ale to nie robi dobrze; tekst wpisany do adnotacji zakończy się pod numerem zamiast strzałki nad paskiem.

Oto moja próba, wraz z nim w wynikach:

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

Annotation attempt

Kolejny problem z moją próbę rozwiązania jest to, że kwadrat kształt wspornika adnotacji nie bardzo jasno, że jestem podświetlanie zakresu (w przeciwieństwie do np. nawiasów klamrowych). Ale przypuszczam, że to po prostu bycie dziadkiem w tym momencie.

+0

użycie dwóch adnotacji, jedna z tekstem, ale nie ma strzałki, a jeden ze strzałką, ale nie tekst. Zobacz także 'axvspan' http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.axvspan – tacaswell

+0

Najlepiej również pokazać, co próbujesz (z fragmentem kodu). – tacaswell

+0

@tcaswell Zastanawiałem się nad użyciem dwóch adnotacji, ale wymagałoby to ręcznego pozycjonowania tekstu i konieczności ręcznej aktualizacji obu, jeśli, powiedzmy, zakresu się porusza. Wydaje się, że byłoby dość powszechnym problemem, że istnieje bardziej optymalne rozwiązanie. – ari

Odpowiedz

4

Wystarczy owinąć to wszystko w funkcję:

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 

przemian

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

Nie jest to dość powszechna operacja, aby uzyskać własną metodę? – ari

+0

Nie wiem o istniejącym, ale właśnie napisałem;) Jeśli mógłbyś podać trochę informacji o używaniu rzeczy, proponuję dodać to do biblioteki jako wbudowane. – tacaswell

+0

Obie są dobrymi opcjami, dziękuję za podzielenie się nimi. Podana funkcja jest już wystarczająca dla większości przypadków, ale jeśli szukasz sposobów na jej poprawę, mogę wymyślić kilka sugestii. – ari

Powiązane problemy