es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ggplot: ¿Cómo establecer diferentes alineaciones en la posición geom_text basadas en el tipo de variable?

Tengo un gráfico de barras apiladas al 100% que muestra 3 tipos de variables. He establecido una base de datos de ejemplo para poder crear un gráfico más fácilmente.

Ya he ajustado el gráfico con los colores y la información que necesito. Pero no he podido posicionar las etiquetas de manera independiente. Aquí está el código y la salida actual.

Código:

(empilhado<-ggplot(dfm, aes(y = Year, x = abs(value), fill = variable)) +
scale_x_continuous(sec.axis = sec_axis(trans = ~.*1, name=”Trab.”), expand=expansion(mult=c(0,0.05)))+
geom_col(data = rotulo, aes(y = Year, x=abs(trabalho), fill=NULL), width = .7, colour=”black”, lwd=0.1, position = “fill”, orientation = “y”) +
geom_label(data = rotulo, aes(y= Year, x = abs(trabalho), fill=NULL, label=paste(format(round(trabalho, digits=0), nsmall=0, decimal.mark=”,”, big.mark=”.”),
format(round(aprovado, digits=0), nsmall=0, decimal.mark=”,”, big.mark=”.”))), color=”black”, size=4, position = position_fill(vjust=1.06)) +
geom_col(width = .7, colour=”black”, lwd=0.1, position = “fill”, orientation = “y”) +
geom_text(aes(label=format(round(value, digits=0), nsmall=0, decimal.mark=”,”, big.mark=”.”)),
size=4, color=”white”, position = position_fill(vjust=0.5)) +
theme(panel.grid.major = element_line(colour = “gray90”,size=0.75), panel.grid.minor = element_line(colour = “gray90″,size=0.75),
legend.position=”top”, axis.text.x = element_blank(), axis.ticks.x = element_blank(),
axis.title.x = element_blank(), panel.background = element_blank())+
scale_fill_manual(values = c(“#000000″,”tomato”,”blue”))

Salida:

Cómo está ahora? position_fill(vjust=0.5), por lo que todas las etiquetas están centradas dentro de su respectiva barra.

¿Lo que quiero? Poder establecer la posición de la etiqueta ‘Marionete’ a la izquierda (como lo haría un vjust=0), mantener la etiqueta ‘Pedido’ como está (en el centro de la barra apilada ‘Pedido’) y colocar la etiqueta ‘Factura’ a la derecha (como lo haría un vjust=1).

¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para posicionar las etiquetas de forma independiente, se pueden utilizar declaraciones ifelse dentro de aes() para el parámetro x y position_fill() para el parámetro vjust. Aquí tienes el código actualizado:

    (empilhado <- ggplot(dfm, aes(y = Year, x = abs(value), fill = variable)) + 
      scale_x_continuous(sec.axis = sec_axis(trans = ~.*1, name="Trab."), expand=expansion(mult=c(0,0.05))) +
      geom_col(width = .7, colour="black", lwd=0.1, position = "fill", orientation = "y") +
      geom_col(data = rotulo, aes(y = Year, x=abs(trabalho), fill=NULL), width = .7, colour="black", lwd=0.1, position = "fill", orientation = "y") +
      geom_label(data = rotulo, aes(y= Year, x = ifelse(variable == "Fatura", value, ifelse(variable == "Pedido", value/2, 0)), fill=NULL, 
                                   label=paste(format(round(trabalho, digits=0), nsmall=0, decimal.mark=",", big.mark="."), 
                                               format(round(aprovado, digits=0), nsmall=0, decimal.mark=",", big.mark="."))), 
                 color="black", size=4, position = position_fill(vjust=ifelse(variable == "Fatura", 1, ifelse(variable == "Pedido", 0.5, 0)))) +
      geom_text(aes(label=format(round(value, digits=0), nsmall=0, decimal.mark=",", big.mark=".")), size=4, color="white", position = position_fill(vjust=0.5)) +
      theme(panel.grid.major = element_line(colour = "gray90",size=0.75), panel.grid.minor = element_line(colour = "gray90",size=0.75),
            legend.position="top", axis.text.x = element_blank(), axis.ticks.x = element_blank(),
            axis.title.x = element_blank(), panel.background = element_blank()) +
      scale_fill_manual(values = c("#000000","tomato","blue")))
    

    En la llamada de geom_label(), ifelse(variable == "Fatura", value, ifelse(variable == "Pedido", value/2, 0)) establece la posición del eje x para cada etiqueta. Si la variable es “Fatura”, utiliza el valor completo, si es “Pedido”, utiliza la mitad del valor (para posicionarlo en el centro), de lo contrario utiliza 0 (para ocultar la etiqueta).

    Luego, position_fill(vjust=ifelse(variable == "Fatura", 1, ifelse(variable == "Pedido", 0.5, 0))) establece la posición vertical de cada etiqueta. Si la variable es “Fatura”, utiliza vjust=1 para posicionarla en la parte superior, si es “Pedido”, utiliza vjust=0.5 para mantenerla centrada, de lo contrario utiliza vjust=0 para posicionarla en la parte inferior.

    Esto debería darte el resultado deseado.

Comments are closed.