r ggplot2 bar-chart geom-bar

ggplot2: Establecer la línea base geom_bar en 1 en lugar de cero



bar-chart geom-bar (3)

Estoy tratando de hacer un gráfico de barras (con geom_bar) de proporciones, y me gustaría establecer el eje x en y = 1. Por lo tanto, las relaciones <1 estarían por debajo del eje y las relaciones> 1 estarían por encima del eje. Puedo hacer algo similar con geom_point:

ggplot(data, aes(x=ratio, y=reorder(place,ratio)))+geom_point()+geom_vline(xintercept=1.0)+coord_flip()

Sin embargo, se preferiría geom_bar ... Idealmente, el gráfico se vería así: http://i.stack.imgur.com/isdnw.png , excepto que las barras "negativas" serían proporciones <1.

¡Muchas gracias por su ayuda!

C


Podemos hacer esto con una transformación personalizada de la escala y:

shift_trans = function(d = 0) { scales::trans_new("shift", transform = function(x) x - d, inverse = function(x) x + d) } ggplot(dat, aes(x, ratio, fill = ifelse(ratio > 1,"GT1","LT1"))) + geom_bar(stat="identity") + scale_fill_manual(values=c("blue","red"), name="LT or GT 1") + scale_y_continuous(trans = shift_trans(1))

Este enfoque es muy general y está parmaterizado.

Usando la respuesta de datos de eipi10: dat = data.frame(ratio=-4:11/3, x=1:16)


Puede cambiar la geom_bar base geom_bar a 1 (en lugar de cero) de la siguiente manera:

  1. Cambie los datos por -1, de modo que ratio=1 convierta en cero y, por lo tanto, se use como línea de base.

  2. Agregue 1 a las etiquetas del eje y para que reflejen los valores de datos reales.

    dat = data.frame(ratio=-4:11/3, x=1:16) ggplot(dat, aes(x, ratio-1, fill=ifelse(ratio-1>0,"GT1","LT1"))) + geom_bar(stat="identity") + scale_fill_manual(values=c("blue","red"), name="LT or GT 1") + scale_y_continuous(labels = function(y) y + 1)


Un segundo enfoque a considerar es usar geom_segment . Esto le permite mantener el eje y ''original''.

set.seed(123) dat <- data.frame(x=1:10, ratio=sort(runif(10,0,2))) #create flag dat$col_flag <- dat$ratio > 1 ggplot(dat, aes(color=col_flag)) + geom_segment(aes(x=x,xend=x,y=1, yend=ratio), size=15)