2011-07-25 37 views
12

Tengo dos conjuntos de puntos con barras de error. Me gustaría desplazar el segundo para que se muestre ligeramente hacia abajo desde el primer conjunto, para que no oscurezca el original.ggplot2 puntos de dispersión diagonales puntos

Aquí es un conjunto de datos simulada:

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 

Este es el código que he usado para producir la trama:

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") 

Y aquí es la trama:

scatterplot

Me gustaría que los asteriscos grises y las barras de errores asociadas se grafican a ha ir debajo de los círculos negros y las barras de error asociadas. Transformaría el conjunto de datos, pero el eje Y son las variables categóricas.

+0

La respuesta de Richie es mucho mejor que mi enfoque, así que eliminé la mía. –

Respuesta

20

El uso de reorganización de sus datos de Richie, esto también es posible puramente interna en ggplot, sin tener que meterse con el eje:

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") 

que me da esta trama:

enter image description here

Nota: Desde la versión 0.9.2 opts ha sido replaced por theme:

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

Disculpe, no estoy familiarizado con los argumentos scale_shape_manual y coord_flip, pero qplot está devolviendo un error: argumento no numérico al operador binario – jslefche

+0

@jslefche - Probablemente esté presentando un error al intentar traducir esta solución a 'qplot'. Aprenda a usar 'ggplot()', le pagará dividendos. – joran

+0

Ahh, veo lo que hiciste allí con coord_flip(). Muy agradable. Funciona muy bien con 'ggplot()'. Marcado como respondido. – jslefche

10

Reorganice sus datos en un marco de datos.

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) 
) 

Añadir una columna que es una versión numérica del factor 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 

Ahora su código de trazado es más simple.

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 tiene un guión fantástico arriba en github que crea una nueva función, position_dodgev, para barras de error horizontal.

Es aquí: https://github.com/jaredlander/coefplot/blob/master/R/position.r

y lo encontré a través de su puesto original, que tiene una versión más antigua que actualmente no funciona con mi instalación de ggplot2: http://www.jaredlander.com/2013/02/vertical-dodging-in-ggplot2/

Puede utilizar su función como lo haría con position_dodge geom_errorbar, por ejemplo,

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

Esta solución funcionó para mí, ya que estoy tallar la trama y no quería ar desastre con la creación de una nueva columna en data.frame.

Cuestiones relacionadas