Cómo centrar tags de diagtwig de barras astackdas

stacked percent barchart trazar un buen diagtwig de stacked percent barchart usando ggplot2 . He leído algo de material y casi logro ttwigr, lo que quiero. Además, adjunto el material, podría ser útil en un solo lugar:

¿Cómo etiqueto un gráfico de barras astackdas en ggplot2 sin crear un cuadro de datos de resumen?

Crea barra de gráficos astackdas donde cada escala se escala para sumr al 100%

R gráfica de porcentaje de barras astackdas con porcentaje de factor binario y tags (con ggplot)

Mi problema es que no puedo colocar labels donde quiero, en el medio de las barras. enter image description here

Puede ver el problema en la imagen de arriba: las tags se ven mal y también se superponen entre sí.

Lo que estoy buscando ahora es:

  1. Cómo colocar tags en el medio de las barras (áreas)

  2. ¿Cómo trazar no todas las tags, pero por ejemplo, que son más de 10%?

  3. ¿Cómo resolver el problema de superposición?

Para la Q 1. @MikeWise sugirió una posible solución . Sin embargo, todavía no puedo lidiar con este problema.

Además, adjunto un ejemplo reproducible, cómo he trazado este grahp.

 library('plyr') library('ggplot2') library('scales') set.seed(1992) n=68 Category <- sample(c("Black", "Red", "Blue", "Cyna", "Purple"), n, replace = TRUE, prob = NULL) Brand <- sample("Brand", n, replace = TRUE, prob = NULL) Brand <- paste0(Brand, sample(1:5, n, replace = TRUE, prob = NULL)) USD <- abs(rnorm(n))*100 df <- data.frame(Category, Brand, USD) # Calculate the percentages df = ddply(df, .(Brand), transform, percent = USD/sum(USD) * 100) # Format the labels and calculate their positions df = ddply(df, .(Brand), transform, pos = (cumsum(USD) - 0.5 * USD)) #create nice labes df$label = paste0(sprintf("%.0f", df$percent), "%") ggplot(df, aes(x=reorder(Brand,USD, function(x)+sum(x)), y=percent, fill=Category))+ geom_bar(position = "fill", stat='identity', width = .7)+ geom_text(aes(label=label, ymax=100, ymin=0), vjust=0, hjust=0,color = "white", position=position_fill())+ coord_flip()+ scale_y_continuous(labels = percent_format())+ ylab("")+ xlab("") 

A continuación, se explica cómo centrar las tags y evitar el trazado de tags para porcentajes pequeños. Un problema adicional en sus datos es que tiene múltiples secciones de barras para cada color. En cambio, me parece que todas las secciones de barras de un color determinado deben combinarse. El código siguiente utiliza dplyr lugar de plyr para configurar los datos para el trazado:

 library(dplyr) # Initial data frame df <- data.frame(Category, Brand, USD) # Calculate percentages and label positions df.summary = df %>% group_by(Brand, Category) %>% summarise(USD = sum(USD)) %>% # Within each Brand, sum all values in each Category mutate(percent = USD/sum(USD), pos = cumsum(percent) - 0.5*percent) 

Para graficar los datos, use una statement ifelse para determinar si una etiqueta se traza o no. En este caso, he evitado trazar una etiqueta para porcentajes inferiores al 7%.

 ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=percent, fill=Category)) + geom_bar(stat='identity', width = .7, colour="black", lwd=0.1) + geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),""), y=pos), colour="white") + coord_flip() + scale_y_continuous(labels = percent_format()) + labs(y="", x="") 

enter image description here

ACTUALIZACIÓN: con ggplot2 versión 2, ya no es necesario calcular las coordenadas de las tags de texto para centrarlas. En cambio, puede usar position=position_stack(vjust=0.5) . Por ejemplo:

 ggplot(df.summary, aes(x=reorder(Brand, USD, sum), y=percent, fill=Category)) + geom_bar(stat="identity", width = .7, colour="black", lwd=0.1) + geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),"")), position=position_stack(vjust=0.5), colour="white") + coord_flip() + scale_y_continuous(labels = percent_format()) + labs(y="", x="") 

enter image description here

Seguí el ejemplo y encontré la manera de poner bonitas tags para el simple gráfico de barras astackdas. Creo que podría ser útil también.

 df <- data.frame(Category, Brand, USD) # Calculate percentages and label positions df.summary = df %>% group_by(Brand, Category) %>% summarise(USD = sum(USD)) %>% # Within each Brand, sum all values in each Category mutate( pos = cumsum(USD)-0.5*USD) ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=USD, fill=Category)) + geom_bar(stat='identity', width = .7, colour="black", lwd=0.1) + geom_text(aes(label=ifelse(USD>100,round(USD,0),""), y=pos), colour="white") + coord_flip()+ labs(y="", x="") 

enter image description here

El mismo ejemplo en macOs Sierra con RStudio 1.0.44 y R versión 3.3.1 muestra otra disposición:

enter image description here