varias superponer modificar lineas graficos graficas ejes r ggplot2 bar-chart axis-labels

superponer - Etiquetas de ejes multirrutas con variables de agrupación anidadas



superponer graficas en r (5)

@ agstudy ya respondió esta pregunta y voy a usarla yo mismo, pero si aceptas algo más feo pero más simple, esto es lo que vine antes de su respuesta:

data <- read.table(text = "Group Category Value S1 A 73 S2 A 57 S1 B 7 S2 B 23 S1 C 51 S2 C 87", header=TRUE) p <- ggplot(data=data, aes(x=Category, y=Value, fill=Group)) p + geom_bar(position = ''dodge'') + geom_text(aes(label=paste(Value, "%")), position=position_dodge(width=0.9), vjust=-0.25) + geom_text(colour="darkgray", aes(y=-3, label=Group), position=position_dodge(width=0.9), col=gray) + theme(legend.position = "none", panel.background=element_blank(), axis.line = element_line(colour = "black"), axis.line.x = element_line(colour = "white"), axis.ticks.x = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank()) + annotate("segment", x = 0, xend = Inf, y = 0, yend = 0)

Lo cual nos dará:

Me gustaría que los niveles de dos variables de agrupación anidadas diferentes aparezcan en líneas separadas debajo de la gráfica, y no en la leyenda. Lo que tengo ahora es este código:

data <- read.table(text = "Group Category Value S1 A 73 S2 A 57 S1 B 7 S2 B 23 S1 C 51 S2 C 87", header = TRUE) ggplot(data = data, aes(x = Category, y = Value, fill = Group)) + geom_bar(position = ''dodge'') + geom_text(aes(label = paste(Value, "%")), position = position_dodge(width = 0.9), vjust = -0.25)

Lo que me gustaría tener es algo como esto:

¿Algunas ideas?


El argumento strip.position en facet_wrap() y el argumento facet_grid() en facet_grid() ya que ggplot2 2.2.0 ahora hace que la creación de una versión simple de este gráfico sea bastante sencilla a través de la facetación. Para darle a la trama el aspecto ininterrumpido, configure el panel.spacing en 0.

Aquí está el ejemplo que usa el conjunto de datos con una cantidad diferente de Grupos por Categoría de la respuesta de @ agtudy.

  • Utilicé scales = "free_x" para descartar el Grupo adicional de las Categorías que no lo tienen, aunque esto no siempre será deseable.
  • El strip.position = "bottom" mueve las etiquetas de facetas a la parte inferior. strip.background el fondo de la tira junto con strip.background , pero pude ver que dejar el rectángulo de la tira sería útil en algunas situaciones.
  • Utilicé el width = 1 para hacer que las barras dentro de cada categoría toquen, tendrían espacios entre ellas por defecto.

También uso strip.placement y strip.background en el theme para obtener las tiras en la parte inferior y eliminar el rectángulo de la tira.

El código para las versiones de ggplot2_2.2.0 o más reciente:

ggplot(data = data, aes(x = Group, y = Value, fill = Group)) + geom_bar(stat = "identity", width = 1) + geom_text(aes(label = paste(Value, "%")), vjust = -0.25) + facet_wrap(~Category, strip.position = "bottom", scales = "free_x") + theme(panel.spacing = unit(0, "lines"), strip.background = element_blank(), strip.placement = "outside")

Podría usar space= "free_x" en facet_grid() si desea que todas las barras tengan el mismo ancho, independientemente de cuántos Grupos por Categoría. Tenga en cuenta que esto utiliza switch = "x" lugar de strip.position . También es posible que desee cambiar la etiqueta del eje x; No estaba seguro de lo que debería ser, ¿tal vez Categoría en lugar de Grupo?

ggplot(data = data, aes(x = Group, y = Value, fill = Group)) + geom_bar(stat = "identity", width = 1) + geom_text(aes(label = paste(Value, "%")), vjust = -0.25) + facet_grid(~Category, switch = "x", scales = "free_x", space = "free_x") + theme(panel.spacing = unit(0, "lines"), strip.background = element_blank(), strip.placement = "outside") + xlab("Category")

Versiones de código antiguas

El código para ggplot2_2.0.0, cuando se presentó por primera vez esta característica, era un poco diferente. Lo he guardado abajo para la posteridad:

ggplot(data = data, aes(x = Group, y = Value, fill = Group)) + geom_bar(stat = "identity") + geom_text(aes(label = paste(Value, "%")), vjust = -0.25) + facet_wrap(~Category, switch = "x", scales = "free_x") + theme(panel.margin = unit(0, "lines"), strip.background = element_blank())


Puede crear una función de elemento personalizado para axis.text.x

library(ggplot2) library(grid) ## create some data with asymmetric fill aes to generalize solution data <- read.table(text = "Group Category Value S1 A 73 S2 A 57 S3 A 57 S4 A 57 S1 B 7 S2 B 23 S3 B 57 S1 C 51 S2 C 57 S3 C 87", header=TRUE) # user-level interface axis.groups = function(groups) { structure( list(groups=groups), ## inheritance since it should be a element_text class = c("element_custom","element_blank") ) } # returns a gTree with two children: # the categories axis # the groups axis element_grob.element_custom <- function(element, x,...) { cat <- list(...)[[1]] groups <- element$group ll <- by(data$Group,data$Category,I) tt <- as.numeric(x) grbs <- Map(function(z,t){ labs <- ll[[z]] vp = viewport( x = unit(t,''native''), height=unit(2,''line''), width=unit(diff(tt)[1],''native''), xscale=c(0,length(labs))) grid.rect(vp=vp) textGrob(labs,x= unit(seq_along(labs)-0.5, ''native''), y=unit(2,''line''), vp=vp) },cat,tt) g.X <- textGrob(cat, x=x) gTree(children=gList(do.call(gList,grbs),g.X), cl = "custom_axis") } ## # gTrees don''t know their size grobHeight.custom_axis = heightDetails.custom_axis = function(x, ...) unit(3, "lines") ## the final plot call ggplot(data=data, aes(x=Category, y=Value, fill=Group)) + geom_bar(position = position_dodge(width=0.9),stat=''identity'') + geom_text(aes(label=paste(Value, "%")), position=position_dodge(width=0.9), vjust=-0.25)+ theme(axis.text.x = axis.groups(unique(data$Group)), legend.position="none")


Una alternativa al método de agstudy es editar el tablable e insertar un "eje" calculado por ggplot2,

p <- ggplot(data=data, aes(x=Category, y=Value, fill=Group)) + geom_bar(position = position_dodge(width=0.9),stat=''identity'') + geom_text(aes(label=paste(Value, "%")), position=position_dodge(width=0.9), vjust=-0.25) axis <- ggplot(data=data, aes(x=Category, y=Value, colour=Group)) + geom_text(aes(label=Group, y=0), position=position_dodge(width=0.9)) annotation <- gtable_filter(ggplotGrob(axis), "panel", trim=TRUE) annotation[["grobs"]][[1]][["children"]][c(1,3)] <- NULL #only keep textGrob library(gtable) g <- ggplotGrob(p) gtable_add_grobs <- gtable_add_grob # let''s use this alias g <- gtable_add_rows(g, unit(1,"line"), pos=4) g <- gtable_add_grobs(g, annotation, t=5, b=5, l=4, r=4) grid.newpage() grid.draw(g)


Una solución muy simple que proporciona un resultado similar (aunque no idéntico) es el uso de facetas. La desventaja es que la etiqueta de Categoría está arriba en lugar de debajo.

ggplot(data=data, aes(x=Group, y=Value, fill=Group)) + geom_bar(position = ''dodge'', stat="identity") + geom_text(aes(label=paste(Value, "%")), position=position_dodge(width=0.9), vjust=-0.25) + facet_grid(. ~ Category) + theme(legend.position="none")