2015-03-27 12 views
6

Mam więc dość duży zbiór danych (Dropbox: csv file), który próbuję wykreślić za pomocą geom_boxplot. Poniższa produkuje to, co wydaje się być rozsądnym działki:mediany boxplot ggplot2 nie są zgodne z oczekiwaniami

require(reshape2) 
require(ggplot2) 
require(scales) 
require(grid) 
require(gridExtra) 

df <- read.csv("\\Downloads\\boxplot.csv", na.strings = "*") 
df$year <- factor(df$year, levels = c(2010,2011,2012,2013,2014), labels = c(2010,2011,2012,2013,2014)) 

d <- ggplot(data = df, aes(x = year, y = value)) + 
    geom_boxplot(aes(fill = station)) + 
    facet_grid(station~.) + 
    scale_y_continuous(limits = c(0, 15)) + 
    theme(legend.position = "none")) 
d 

Jednak, kiedy kopać głębiej, problemy pełzanie, które mnie przerażają. Kiedy oznaczałem medianami boxplot ich wartości, pojawia się następujący wykres.

df.m <- aggregate(value~year+station, data = df, FUN = function(x) median(x)) 
d <- d + geom_text(data = df.m, aes(x = year, y = value, label = value)) 
d 

boxplots-with-medians-labelled

Mediany nakreślonego przez geom_boxplot nie są median w ogóle. Etykiety są drukowane z prawidłową wartością osi y, ale środkowy zawias na płaszczyznach pudełka zdecydowanie nie znajduje się na medianach. Byłem zaskoczony przez to od kilku dni.

Jaki jest tego powód? W jaki sposób można uzyskać ten typ wyświetlacza z prawidłowymi medianami? W jaki sposób można debugować lub diagnozować ten wykres?

+1

Twój przykładowy kod zawiera niespójność. Wywołujesz 'geom_text' przeciwko' temp.m', ale mediana została obliczona na 'turb.m'. Czy to może być problem? – vpipkt

+0

Ah! Wezwanie do tego ... Próbowałem usunąć moje niespójności z oryginalnego kodu, ale tęskniłem za tym. Ten błąd spowodowałby awarię warstwy geom_text, ale nawet bez dodania geom_text do wykresu, mediany są nadal rysowane niepoprawnie na działkach. –

+0

Czy "*" w polu "wartość" należy interpretować jako NA? – vpipkt

Odpowiedz

5

Rozwiązanie tego pytania znajduje się w aplikacji scale_y_continuous. ggplot2 będzie wykonywać operacje w następującej kolejności:

  1. Scale Przekształceń
  2. Obliczenia statystyczne
  3. transformacji współrzędnych

W tym przypadku, ponieważ transformacja skala jest wywoływana danych, ggplot2 wyklucza poza skalą granice dla obliczeń statystycznych zawiasów boxplot. Mediany obliczone przez funkcję aggregate i użyte w instrukcji geom_text wykorzystają jednak cały zbiór danych. Może to skutkować różnymi medianowymi zawiasami i etykietami tekstowymi.

Roztwór pominąć instrukcje scale_y_continuous i zamiast używać:

d <- ggplot(data = df, aes(x = year, y = value)) + 
geom_boxplot(aes(fill = station)) + 
facet_grid(station~.) + 
theme(legend.position = "none")) + 
coord_cartesian(y = c(0,15)) 

Pozwala ggplot2 obliczyć boxplot statystyk zawiasu za pomocą całego zestawu danych, jednocześnie ograniczając wielkość poletka rysunku.

+0

To poważny problem z ggplot2 imho. Używam go przez długi czas, nie podnosząc tego - powinny istnieć ostrzeżenia. – ajrwhite

+1

Uczyniło mnie to bardzo ostrożnym - i nerwowym - o tym, jak interpretuję moje dane. Kiedy pierwszy raz się z tym spotkałem, zakwestionowałem wszystko na temat R, aż w końcu zrozumiałem, co się dzieje. Jestem pewien, że istnieje wiele przypadkowych użytkowników R/ggplot, którzy nie są świadomi, że może to wpłynąć na ich pracę. –

Powiązane problemy