Comment centrer des étiquettes empilées pour cent barchart
je suis en train de tracer nice stacked percent barchart
en utilisant ggplot2
. J'ai lu des documents et j'ai presque réussi à comploter, ce que je veux. En outre, je joins le matériel, il pourrait être utile dans un endroit:
comment étiqueter un diagramme à barres empilées dans ggplot2 sans créer une base de données sommaire?
Créer empilés barplot où chaque pile est mis à l'échelle pour la somme de 100%
R barre de pourcentage empilée avec pourcentage de facteur binaire et les étiquettes (avec ggplot)
Mon problème est que je ne peux pas mettre labels
où je veux - au milieu des barreaux.
vous pouvez voir le problème dans l'image ci - dessus-les étiquettes semblent awfull et se chevauchent également.
Ce que je cherche maintenant, c'est:
Comment placer des étiquettes dans le milieu des barres (zones)
Comment intrigue pas toutes les étiquettes, mais pour exemple qui sont plus grands que 10%?
comment résoudre le problème de chevauchement?
pour le Q 1.
@Mikiewise suggérée possible solution. Cependant, je ne peux toujours pas faire face à 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("")
3 réponses
Voici comment centrer les étiquettes et éviter de tracer des étiquettes pour les petits pourcentages. Un problème supplémentaire dans vos données est que vous avez plusieurs sections de barre 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
mettre en place les données de tracé:
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, utiliser un ifelse
énoncé pour déterminer si une étiquette est tracée ou non. Dans ce cas, j'ai évité de comploter une étiquette pour les 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="")
mise à jour: Avec ggplot2 la version 2, il n'est plus nécessaire de calculer les coordonnées des étiquettes de texte pour obtenir centré. 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 j'ai trouvé comment mettre de belles étiquettes pour un barchart empilé simple. Je pense qu'il 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="")