2009-09-27 11 views
6

Powiedzmy, że masz następujący zestaw danych:Dodawanie statystyki podsumowujące (lub nawet surowe punkty danych) do unik boxplots pozycji

trt <- ifelse(runif(100)<0.5,"drug","placebo") 
inj.site <- ifelse(runif(100)<0.5,"ankle","wrist") 
relief <- 20 + 0.5*(inj.site=="ankle") + 0.5*(trt=="drug") + rnorm(100) 
to.analyze <- data.frame(trt,inj.site,relief) 

Teraz chodzi o to, aby zrobić wykres typu boxplot z miejsca urazu na osi x i pudełkach przez leczenie obok siebie:

bplot <- ggplot(to.analyze,aes(inj.site,relief,fill=trt)) + geom_boxplot(position="dodge") 

Wystarczająco łatwe. Ale teraz chcę dodać punkty danych nieprzetworzonych na wierzchu skrzynek. Jeśli nie mam pudełka z position="dodge", to byłoby proste:

bplot + geom_point(aes(colour=trt)) 

Jednak ta rysuje punkty pomiędzy skrzynkami, a dodając do tego position="dodge" geometrii nie wydają się działać. Jak mogę to zmienić, aby punkty były rysowane nad polami?

Premia: ta sama sytuacja z użyciem stat_summary(blah,y.fun=mean,shape="+") do przeciążenia środków, które mają ten sam problem.

+0

ulga <- 20 + 0,5 * (inj.site == kostka) + 0,5 * (Trt == "lek") + rnorm (100) należy: ulga <- 20 + 0,5 * (inj.site == "kostka") + 0,5 * (trt == "lek") + rnorm (100) – Paolo

+0

er, tak, naprawiono. –

Odpowiedz

3

Hadley niewątpliwie mnie poprawić jeśli się mylę tutaj ...

Oto naturalna składnia:

bplot + geom_point(aes(colour=trt), position=position_dodge(width=.5)) 

(pozycja = „unik” zrobi to samo, bez parametru.)

Kiedy ją spiskuję, otrzymuję coś, co wygląda jak position_jitter(), co jest prawdopodobnie tym, co dostajesz.

Ciekawy, poszedłem szukać źródła, gdzie znalazłem funkcję pos_dodge(). (Typ pos_dodge w wierszu R to zobaczyć ...) Oto jego koniec:

within(df, { 
    xmin <- xmin + width/n * (seq_len(n) - 1) - diff * (n - 1)/(2 * n) 
    xmax <- xmin + d_width/n 
    x <- (xmin + xmax)/2 
}) 

n jest liczbą wierszy ramki danych. Wygląda więc na to, że unika on poszczególnych punktów o ułamek indeksowany przez rząd! Tak więc pierwszym punktem jest uniknięta szerokość/n, druga jest uniknięta 2 * szerokość/n, a ostatnia jest uniknięta n * szerokość/n.

To oczywiście nie jest to, co oznaczało, chociaż to właśnie powiedziałeś powiedział. Być może utknąłeś, odtwarzając skradziony boxplot ręcznie lub używając innej wizualizacji, na przykład faceting?

ggplot(to.analyze,aes(inj.site,relief)) + geom_boxplot() + facet_wrap(~ trt) 
+0

W faceting, działa idealnie. Jednak z powodów wizualizacji zdecydowanie wolałbym uniknąć pozycji, chociaż mógłbym spróbować fasetowania na stronie inj.site? –

Powiązane problemy