studio - superponer graficas en r
Cómo centrar etiquetas de gráfico de barras de porcentaje apiladas (2)
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 barra de un color dado deberían combinarse.
El siguiente código usa
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 trazar los datos, use una declaración
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="")
ACTUALIZACIÓN:
Con ggplot2 versión 2, ya no es necesario calcular las coordenadas de las etiquetas de texto para centrarlas.
En su lugar, 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="")
Estoy tratando de trazar un buen gráfico de
stacked percent barchart
usando
ggplot2
.
He leído algo de material y casi logro trazar lo que quiero.
Además, adjunto el material, podría ser útil en un solo lugar:
¿Cómo etiqueto un gráfico de barras apiladas en ggplot2 sin crear un marco de datos de resumen?
Cree un diagrama de barras apilado donde cada pila se escala para sumar al 100%
R gráfico de barras de porcentaje apiladas con porcentaje de factor binario y etiquetas (con ggplot)
Mi problema es que no puedo colocar
labels
donde quiero, en el medio de las barras.
Puede ver el problema en la imagen de arriba: las etiquetas se ven horribles y también se superponen entre sí.
Lo que estoy buscando ahora es:
-
Cómo colocar etiquetas en el medio de las barras (áreas)
-
¿Cómo trazar no todas las etiquetas, pero, por ejemplo, cuáles son superiores al 10%?
-
¿Cómo resolver el problema de superposición?
Para la
Q 1.
@MikeWise sugirió una posible
solution
.
Sin embargo, todavía no puedo lidiar con este problema.
Además, adjunto 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("")
Seguí el ejemplo y encontré la forma de poner buenas etiquetas para un simple gráfico de barras apiladas. Creo que también podría ser útil.
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="")