2014-10-10 24 views
6

Występuje dziwne zachowanie w funkcji matplotlibboxplot, kiedy używam kształtu "". Używam kodu, który napisałem jakiś czas temu i nigdy nie miałem takich problemów - zastanawiam się, jaki jest problem. Jakieś pomysły?Dziwne zachowanie matplotlibs boxplot przy użyciu kształtu karbu

weird behaviour on notched boxplots

Po włączeniu kształt karbu poza tym wygląda normalnie chociaż

unnotched boxplots look normal

Byłby to kod:

def boxplot_modified(data): 

    fig = plt.figure(figsize=(8,6)) 
    ax = plt.subplot(111) 

    bplot = plt.boxplot(data, 
      #notch=True,   # notch shape 
      vert=True,   # vertical box aligmnent 
      sym='ko',   # red circle for outliers 
      patch_artist=True, # fill with color 
      ) 

    # choosing custom colors to fill the boxes 
    colors = 3*['lightgreen'] + 3*['lightblue'], 'lightblue', 'lightblue', 'lightblue'] 
    for patch, color in zip(bplot['boxes'], colors): 
     patch.set_facecolor(color) 

    # modifying the whiskers: straight lines, black, wider 
    for whisker in bplot['whiskers']: 
     whisker.set(color='black', linewidth=1.2, linestyle='-')  

    # making the caps a little bit wider 
    for cap in bplot['caps']: 
     cap.set(linewidth=1.2) 

    # hiding axis ticks 
    plt.tick_params(axis="both", which="both", bottom="off", top="off", 
      labelbottom="on", left="off", right="off", labelleft="on") 

    # adding horizontal grid lines 
    ax.yaxis.grid(True) 

    # remove axis spines 
    ax.spines["top"].set_visible(False) 
    ax.spines["right"].set_visible(False) 
    ax.spines["bottom"].set_visible(True) 
    ax.spines["left"].set_visible(True) 

    plt.xticks([y+1 for y in range(len(data))], 8*['x']) 

    # raised title 
    #plt.text(2, 1, 'Modified', 
    #  horizontalalignment='center', 
    #  fontsize=18) 

    plt.tight_layout() 
    plt.show() 

boxplot_modified(df.values) 

i kiedy zrobić zwykły działka bez dostosowanie, problem nadal występuje:

def boxplot(data): 

    fig = plt.figure(figsize=(8,6)) 
    ax = plt.subplot(111) 

    bplot = plt.boxplot(data, 
      notch=True,   # notch shape 
      vert=True,   # vertical box aligmnent 
      sym='ko',   # red circle for outliers 
      patch_artist=True, # fill with color 
      ) 

    plt.show() 
boxplot(df.values) 

notch plot without customization still looks weird

+0

Czy możesz podać samodzielny przykład zawierający dane? –

+0

Wygląda to na kolejną regresję boxplot ... możesz a) zrobić samodzielny przykład b) stworzyć problem na githubie? – tacaswell

+0

Zarówno gotowe! Oto przykład [samodzielny] (http://nbviewer.ipython.org/github/rasbt/matplotlib-gallery/blob/master/bugreport/boxplot_notch/boxplot_notch.ipynb) i tutaj [problem na github] (https) : //github.com/matplotlib/matplotlib/issues/3631) – Sebastian

Odpowiedz

6

Dobra, jak się okazuje, jest to rzeczywiście poprawne zachowanie;)

Od Wikipedia:

ząbkiem Działki box zastosować "wycięcie" lub zwężenie pole wokół mediany. Wycięcia są użyteczne w oferowaniu przybliżonego przewodnika dla znaczenia różnicy median; jeśli nacięcia dwóch pudełek nie zachodzą na siebie, daje to dowód statystycznie znaczącej różnicy między medianami. Szerokość wycięć jest proporcjonalna do zakresu międzykwartylowego próbki i odwrotnie proporcjonalna do pierwiastka kwadratowego wielkości próbki. Jednak nie ma pewności co do najbardziej odpowiedniego mnożnika (ponieważ może się on różnić w zależności od podobieństwa wariancji próbek). Jedną z konwencji jest użycie +/- 1,58 * IQR/sqrt (n).

Zostało to również omówione w issue on GitHub; R daje podobny wynik jako dowód, że to zachowanie jest "poprawne".

Tak więc, jeśli mamy ten dziwny "przewrócony" wygląd na wykresach z karbem, oznacza to po prostu, że pierwszy kwartyl ma niższą wartość niż pewność średniej i odwrotnie dla trzeciego kwartylu. Chociaż wygląda to paskudnie, to w rzeczywistości przydatna informacja o (nie) pewności median.

ładującego (losowe pobieranie próbek z wymianą oszacowania parametrów rozkładu próbek, tutaj: przedziały ufności) może zmniejszyć ten efekt:

z dokumentacji plt.boxplot:

bootstrap: Brak (ustawienie domyślne) lub liczbę całkowitą Określa, czy należy uruchomić przedziały ufności wokół mediany dla karbowanych ścian działowych. Jeśli bootstrap == Brak, nie wykonuje się ładowania początkowego, a wycięcia są obliczane przy użyciu aproksymacji asymptotycznej opartej na Gaussie (patrz McGill, R., Tukey, JW i Larsen, WA, 1978, oraz Kendall i Stuart, 1967). W przeciwnym razie, bootstrap określa liczbę razy do początkowej wartości mediany, aby określić jej 95% przedziały ufności. Zalecane są wartości od 1000 do 10000.