Esta cuestión se puede tratar de variadas maneras, pero te damos la respuesta más completa para nosotros.
Aquí se explica cómo centrar las etiquetas y evitar trazar etiquetas para porcentajes pequeños. Un problema adicional en sus datos es que tiene múltiples secciones de barra para cada color. En cambio, me parece que todas las secciones de la barra de un color determinado deberían combinarse. El siguiente código usa dplyr
en vez de plyr
para configurar los datos para el trazado:
library(dplyr)
# Initial data frame
df <- data.frame(Category, Brand, USD)
# Calculate percentages
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))
Con ggplot2 versión 2, ya no es necesario calcular las coordenadas de las etiquetas de texto para centrarlas. En su lugar, puede utilizar 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="")
Con versiones anteriores, necesitamos calcular la posición. (Igual que arriba, pero con una línea adicional que define pos
):
# 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)
Luego grafica los datos usando un ifelse
instrucción para determinar si una etiqueta está trazada 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="")
Si haces scroll puedes encontrar los comentarios de otros usuarios, tú igualmente tienes la habilidad insertar el tuyo si te gusta.