varias superponer poner los leyenda grafico graficas ggplot etiquetas escala ejes como cambiar barras r ggplot2 dplyr reshape2

superponer - varias graficas en r



Agregar porcentajes a una columna de columnas agrupadas en GGplot2 (1)

Puede agregar conteos como texto usando stat_count con geom="text" . ..count.. es la variable interna que ggplot crea para contener los valores de conteo. El ejemplo a continuación muestra cómo agregar cuentas y porcentajes usando stat_count , aunque puede, por supuesto, elegir incluir solo uno de ellos.

stat="identity" no hace nada dentro de aes . Normalmente lo pondrías dentro del geom. Pero en este caso no quiere stat="identity" porque realmente quiere que ggplot cuente el número de valores en cada categoría. Utilizaría stat="identity" con geom_bar si estuviera usando un marco de datos con una columna que ya contenía los recuentos para cada categoría.

Para crear el texto de la etiqueta, use paste0 para combinar los valores calculados (por ej., ..count../sum(..count..)*100 es el porcentaje) con texto como el signo % . Además, en este caso he usado el carácter de nueva línea /n para poner el porcentaje y contar en líneas separadas. sprintf es una función de formateo que en este caso produce valores redondeados a un decimal. 1

ggplot(ExampleM, aes(x=variable, fill=value)) + geom_bar(position="dodge") + stat_count(aes(label=paste0(sprintf("%1.1f", ..count../sum(..count..)*100), "%/n", ..count..), y=0.5*..count..), geom="text", colour="white", size=4, position=position_dodge(width=1)) + facet_grid(~Year)

Aquí hay un ejemplo en el que resume previamente los datos y usa stat="identity" cuando los traza: suponga que en lugar de que los porcentajes sean el porcentaje de todos los valores, quiere porcentajes dentro de cada trimestre. También apilemos las barras y agreguemos los porcentajes a las barras como texto:

Primero, crea el resumen de datos. Usaremos dplyr para poder usar el operador de encadenamiento ( %>% ). Contabilizaremos el número de valores, calcularemos porcentajes dentro de cada combinación de Year y variable y también agregaremos n.pos para proporcionar valores y para la ubicación del texto en un gráfico de barras apiladas.

library(dplyr) summary = ExampleM %>% group_by(Year, variable, value) %>% tally %>% group_by(Year, variable) %>% mutate(pct = n/sum(n), n.pos = cumsum(n) - 0.5*n)

Ahora para la trama. Tenga en cuenta que suministramos y=n . Dado que hemos pre-resumido los datos (en lugar de tener recuentos y porcentajes calculados dentro de geom_bar ) necesitamos stat="identity" .

ggplot(summary, aes(x=variable, y=n, fill=value)) + geom_bar(stat="identity") + facet_grid(.~Year) + geom_text(aes(label=paste0(sprintf("%1.1f", pct*100),"%"), y=n.pos), colour="white")

1 Puedes usar round cambio, pero prefiero sprintf porque mantiene un cero en el lugar decimal incluso cuando la parte decimal es cero, mientras que round devuelve solo la parte entera cuando la parte decimal es cero. Por ejemplo, compare round(3.04, 1) y sprintf("%1.1f", 3.04)

ACTUALIZACIÓN: para responder las preguntas en sus comentarios:

  1. ¿Cuál es el motivo de la segunda "línea group_by"? Hemos calculado los recuentos para cada combinación de año, variable y valor. Ahora, queremos saber, dentro de cada combinación de Año y variable, qué porcentaje tenía valor = "Satisfecho" y qué porcentaje tenía valor = "Insatisfecho". Para eso, solo queremos agrupar por año y variable.

  2. Explica la línea y=n.pos . Aquí es donde calculamos la posición y para cada etiqueta de porcentaje. Queremos que la etiqueta esté en el medio de cada barra, pero las barras están apiladas. Si usamos solo cumsum(n) las etiquetas estarían en la parte superior de cada sección de la barra. Restamos 0.5*n para que la posición y de cada etiqueta se reduzca a la mitad de la altura de la sección de la barra que contiene esa etiqueta.

    Aquí hay un ejemplo: supongamos que tenemos tres secciones de barra con alturas 1, 2 y 3 (apiladas de abajo hacia arriba en ese orden) y queremos calcular las posiciones y para nuestras etiquetas.

    h = 1:3 cumsum(h) # 1 3 6 0.5 * h # 0.5 1.0 1.5 cumsum(h) - 0.5 * h # 0.5 2.0 4.5

    Esto da posiciones y que centran verticalmente la etiqueta dentro de cada sección de barra.

  3. ¿Cómo puedo ordenar las columnas del eje x en orden descendente de porcentajes? Por defecto, ggplot ordena un eje x discreto ordenando las categorías de la variable x . Para una variable de carácter, el orden será alfabético. Para una variable de factor, el orden será el orden de los niveles del factor.

    En mi ejemplo, los niveles de summary$variable son los siguientes:

    levels(summary$variable) [1] "Q1" "Q2"

    Para reordenar por pct , una forma sería con la función de reorder . Compare estos (usando el cuadro de datos resumidos de arriba):

    summary$pct2 = summary$pct + c(0.3, -0.15, -0.45, -0.4, -0.1, -0.2, -0.15, -0.1) ggplot(summary, aes(x=variable, y=pct2, fill=value)) + geom_bar(position="stack", stat="identity") + facet_grid(~Year) ggplot(summary, aes(x=reorder(variable, pct2), y=pct2, fill=value)) + geom_bar(position="stack", stat="identity") + facet_grid(~Year)

    Observe que en el segundo gráfico, el orden de "Q1" y "Q2" ahora se ha invertido. Sin embargo, note en el panel izquierdo, la pila Q1 es más alta mientras que en el panel derecho, la pila Q2 es más alta. Con la facetación se obtiene el mismo orden del eje x en cada panel, con el orden determinado (hasta donde puedo decir) al comparar la suma de todos los valores Q1 y la suma de todos los valores Q2. La suma de Q2 es más pequeña, por lo que van primero. Lo mismo ocurre cuando usas position="dodge" , pero utilicé "stack" para que sea más fácil ver lo que está sucediendo. Los siguientes ejemplos ayudarán a aclarar las cosas.

    # Fake data values = c(4.5,1.5,2,1,2,4) dat = data.frame(group1=rep(letters[1:3], 2), group2=LETTERS[1:6], group3=rep(c("W","Z"),3), pct=values/sum(values)) levels(dat$group2) [1] "A" "B" "C" "D" "E" "F" # plot group2 in its factor order ggplot(dat, aes(group2, pct)) + geom_bar(stat="identity", position="stack", colour="red", lwd=1) # plot group2, ordered by -pct ggplot(dat, aes(reorder(group2, -pct), pct)) + geom_bar(stat="identity", colour="red", lwd=1) # plot group1 ordered by pct, with stacking ggplot(dat, aes(reorder(group1, pct), pct)) + geom_bar(stat="identity", position="stack", colour="red", lwd=1) # Note that in the next two examples, the x-axis order is b, a, c, # regardless of whether you use faceting ggplot(dat, aes(reorder(group1, pct), pct)) + geom_bar(stat="identity", position="stack", colour="red", lwd=1) + facet_grid(.~group3) ggplot(dat, aes(reorder(group1, pct), pct, fill=group3)) + geom_bar(stat="identity", position="stack", colour="red", lwd=1)

    Para obtener más información sobre el pedido de valores de eje al establecer pedidos de factores, esta publicación de blog puede ser útil.

Esperando que alguien me ayude a etiquetar las columnas de un gráfico de barras agrupado con porcentajes. No pude encontrar una publicación existente que pudiera hacer un trabajo exitoso. A continuación se muestra el código para un marco de datos de ejemplo básico.

Service<-c("AS","AS","PS","PS","RS","RS","ES","ES") Year<-c("2015","2016","2015","2016","2015","2016","2015","2016") Q1<-c("Dissatisfied","Satisfied","Satisfied","Satisfied","Dissatisfied","Dissatisfied","Satisfied","Satisfied") Q2<-c("Dissatisfied","Dissatisfied","Satisfied","Dissatisfied","Dissatisfied","Satisfied","Satisfied","Satisfied") Example<-data.frame(Service,Year,Q1,Q2)

Luego, lo fundí con Reshape2 para poder trazar las variables de la columna Q1 y Q2 a lo largo del eje x. Luego creé un gráfico de barras agrupado básico con ggplot2, con recuentos en el eje y, y luego una faceta por año.

ExampleM<-melt(Example,id.vars=c("Service","Year")) ggplot(ExampleM,aes(x=variable,stat="identity",fill=value)) + geom_bar(position="dodge") + facet_grid(~Year)

Lo que estoy luchando es cómo agregar etiquetas de columna. Específicamente, me gustaría saber cómo agregar recuentos de frecuencia básicos, así como porcentajes. No ambos juntos, sino uno o el otro. No puedo hacer ningún trabajo. Intenté usar "+ geom_text (aes (labels =" pero no estoy seguro de qué poner como etiqueta, ya que utilicé stat = "identity" en el código ggplot).

Además, para los porcentajes, ¿debo calcularlo primero con dplyr o puedo calcular los porcentajes dentro del código ggplot? Tampoco sé lo suficiente sobre las etiquetas en R, por lo que no estoy seguro de cómo agregar el signo% real.

¡Espero que alguien me muestre una forma básica de lograr todo esto!