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. enter image description here

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:

  1. Comment placer des étiquettes dans le milieu des barres (zones)

  2. Comment intrigue pas toutes les étiquettes, mais pour exemple qui sont plus grands que 10%?

  3. 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("")
19
demandé sur Community 2016-01-20 17:57:35

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="")

enter image description here

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="")

enter image description here

28
répondu eipi10 2017-02-09 04:01:16

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="")

enter image description here

1
répondu AK47 2016-01-21 12:59:04

même exemple dans macOs Sierra avec RStudio 1.0.44 et R version 3.3.1 montre un autre arrangement:

enter image description here

-3
répondu dir 2016-11-13 12:23:02