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:
-
Cambie los datos por -1, de modo que
ratio=1
convierta en cero y, por lo tanto, se use como línea de base. -
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)