2011-07-25 6 views
12

Mam dwa zestawy punktów z paskami błędów. Chciałbym skompensować sekundę, więc wyświetla się nieco w dół od pierwszego zestawu, tak aby nie zasłaniała oryginału.punkty rozrzutu przesunięcia ggplot2

Oto mock zestaw danych:

x=runif(4,-2,2) 
y=c("A","B","C","D") 
upper=x+2 
lower=x-2 
x_1=runif(4,-1,3) 
upper_1=x_1+1 
lower_1=x_1-2 

Oto kod, który kiedyś produkować działki:

qplot(x,y)+ 
    geom_point(size=6)+ 
    geom_errorbarh(aes(xmax=upper,xmin=lower),size=1)+ 
    geom_point(aes(x_1,y),size=6,pch=8,vjust=-1,col="grey40")+ 
    geom_errorbarh(aes(xmax=upper_1,xmin=lower_1),size=1,col="grey40") 

A oto działki:

scatterplot

Chciałbym, aby szare gwiazdki i powiązane paski błędów były drukowane a ha ir poniżej czarnych kółek i powiązanych pasków błędów. Przetransformowałbym zestaw danych, ale oś Y to zmienne kategoryczne.

+0

Odpowiedź Richie jest znacznie lepsza niż moje podejście, więc usunąłem swoje. –

Odpowiedz

20

Korzystanie reorganizację Richiego swoich danych, jest to również możliwe wyłącznie wewnątrz ggplot, bez bałaganu z osią:

dodge <- position_dodge(width=0.5) 
p <- ggplot(dfr,aes(x=y,y=x,colour=type)) + 
     geom_point(aes(shape=type),position=dodge) + 
     geom_errorbar(aes(ymax=upper,ymin=lower),position = dodge) + 
     scale_colour_manual(values = c('gray','black')) + 
     scale_shape_manual(values = c(8,19)) + 
     coord_flip() + 
     opts(legend.position="none") 

co daje mi tę działkę:

enter image description here

Uwaga: Od wersji 0.9.2 opts została replaced przez theme:

+ theme(legend.position = "none") 
+0

Niestety, nie znasz argumentów scale_shape_manual i coord_flip, ale qplot wywołuje błąd: Non-numeryczny argument operatora binarnego – jslefche

+0

@jslefche - Prawdopodobnie wprowadzasz błąd, próbując przetłumaczyć to rozwiązanie na 'qplot'. Naucz się używać 'ggplot()', to będzie wypłacać dywidendy. – joran

+0

Ahh, widzę, co zrobiłeś tam z coord_flip(). Bardzo dobrze. Działa wspaniale z 'ggplot()'. Oznaczono jako odpowiedź. – jslefche

10

Uporządkuj swoje dane w ramkę danych.

x = runif(4,-2,2) 
x_1 = runif(4,-1,3) 
dfr <- data.frame(
    x = c(x, x_1), 
    y = rep(c("A","B","C","D"), 2), 
    upper = c(x+2, x_1+1), 
    lower = c(x-2, x_1-2), 
    type = rep(c("alpha", "beta"), each = 4) 
) 

Dodaj kolumnę, która jest numeryczną wersją czynnika y.

dfr$y_numeric <- with(dfr, 
    as.numeric(y) - ifelse(type == "alpha", 0, 0.1) 
) 

      x y upper  lower type y_numeric 
1 0.16694617 A 2.166946 -1.83305383 alpha  1.0 
2 1.95060734 B 3.950607 -0.04939266 alpha  2.0 
3 1.85516860 C 3.855169 -0.14483140 alpha  3.0 
4 0.08773196 D 2.087732 -1.91226804 alpha  4.0 
5 0.74837995 A 1.748380 -1.25162005 beta  0.9 
6 0.61489655 B 1.614897 -1.38510345 beta  1.9 
7 2.31641418 C 3.316414 0.31641418 beta  2.9 
8 2.62842027 D 3.628420 0.62842027 beta  3.9 

Teraz Twój kod jest prostszy.

ggplot(dfr, aes(x, y_numeric, colour = type)) + 
    geom_point(size = 6) + 
    geom_errorbarh(aes(xmax = upper,xmin = lower), size = 1) + 
    scale_colour_grey() 

final image with staggered plots

1

Jared Lander ma fantastyczny scenariusz Up na github, który tworzy nową funkcję, position_dodgev, dla poziomych prętów o błędach.

To tutaj: https://github.com/jaredlander/coefplot/blob/master/R/position.r

I znalazłem go w jego oryginalnym poście, który ma starszą wersję, która aktualnie nie działa z moim instalacja ggplot2: http://www.jaredlander.com/2013/02/vertical-dodging-in-ggplot2/

Można wykorzystać swoją funkcję jak byś position_dodge z geom_errorbar np

... + geom_errorbarh(aes(xmin = LowInner, 
    xmax = HighInner), height = 0.5, lwd = 1, position = position_dodgev(height = 0.8)) 

To rozwiązanie pracował dla mnie, a ja szlifowaniem działkę i nie chce zadzierać AR z utworzeniem nowej kolumny w data.frame.