web-dev-qa-db-fra.com

Comment centrer les étiquettes empilées en pourcentage

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:

Comment puis-je étiqueter un graphique à barres empilées dans ggplot2 sans créer de cadre de données récapitulatif?

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

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:

  1. Comment placer des étiquettes au milieu des barres

  2. Comment ne pas tracer toutes les étiquettes, mais par exemple qui sont supérieures à 10%?

  3. 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("")
20
AK47

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

 enter image description here

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

 enter image description here

30
eipi10

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

 enter image description here

1
AK47