J'essaie de tracer Nice stacked percent barchart
en utilisant ggplot2
. J'ai lu des documents et j'ai presque réussi à tracer ce que je veux. Aussi, je joins le matériel, il pourrait être utile à un endroit:
Créer un barplot empilé dans lequel chaque pile est réduite à 100%
R graphique en pourcentage empilé avec pourcentage de facteur binaire et libellés (avec ggplot)
Mon problème est que je ne peux pas placer labels
où je veux - au milieu des barres.
Vous pouvez voir le problème dans l'image ci-dessus - les étiquettes ont un aspect moche et se chevauchent également.
Ce que je cherche en ce moment, c'est:
Comment placer des étiquettes au milieu des barres
Comment ne pas tracer toutes les étiquettes, mais par exemple qui sont supérieures à 10%?
Comment résoudre le problème de chevauchement?
Pour le Q 1.
@MikeWise suggéré possible solution . Cependant, je ne peux toujours pas traiter ce problème.
Aussi, je joins un exemple reproductible, comment j'ai tracé ce 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("")
Voici comment centrer les étiquettes et éviter de tracer des étiquettes pour de petits pourcentages. Un problème supplémentaire dans vos données est que vous avez plusieurs sections de barres pour chaque couleur. Au lieu de cela, il me semble que toutes les sections de barre d’une couleur donnée devraient être combinées. Le code ci-dessous utilise dplyr
au lieu de plyr
pour configurer les données pour le traçage:
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)
Pour tracer les données, utilisez une instruction ifelse
pour déterminer si une étiquette est tracée ou non. Dans ce cas, j'ai évité de tracer une étiquette pour des pourcentages inférieurs à 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="")
UPDATE: Avec ggplot2 version 2, il n'est plus nécessaire de calculer les coordonnées des étiquettes de texte pour les centrer. Au lieu de cela, vous pouvez utiliser position=position_stack(vjust=0.5)
. Par exemple:
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="")
J'ai suivi l'exemple et trouvé le moyen de mettre des étiquettes Nice pour un simple graphique à barres empilées. Je pense que cela pourrait être utile aussi.
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="")