8
votes

Comment empêcher deux étiquettes de se chevaucher dans une barchart?

L'image ci-dessous montre un graphique que j'ai créé avec le code ci-dessous. J'ai mis en évidence les étiquettes manquantes ou qui se chevauchent. Y a-t-il un moyen de dire à GGPLot2 de ne pas chevaucher des étiquettes?

Entrez la description de l'image ici < Pré> xxx


2 commentaires

Vous pouvez tracer du texte à des coordonnées spécifiques. Ce n'est pas la meilleure approche, mais cela fera le travail.


@RICARDO: C'est une idée, mais la barre pourrait être de n'importe quelle hauteur.


4 Réponses :


5
votes

Une solution pour éviter les chevauchements est d'utiliser la position des barres et des textes. Pour éviter les valeurs manquantes, vous pouvez définir ylim code>. Voici un exemple.

Entrez l'image Description ici P>

##  I create some more realistic data similar to your picture
week <- sample(0:5,1000,rep=TRUE)
statuses <- gl(2,1000,labels=c('Not-Shipped', 'Shipped'))
dat <- data.frame(Week = week, Status = statuses)

## for dodging
dodgewidth <- position_dodge(width=0.9)
## get max y to set ylim
ymax <- max(table(dat$Week,dat$Status))+20
ggplot(dat,aes(x = factor(Week),fill = factor(Status))) + 
  geom_bar( position = dodgewidth ) +
  stat_bin(geom="text", position= dodgewidth, aes( label=..count..),
           vjust=-1,size=5)+
  ylim(0,ymax)


0 commentaires

7
votes

Fabriqué de nouveaux échantillons de données (inspiré par le code de @Astustudy). xxx pré>

à l'aide de la fonction ddply () code> à partir de la bibliothèque Plyr code> fabriqué Nouveau cadre de données text.df code> pour les étiquettes. Colonne comptage code> contient le nombre d'observations dans chaque combinaison de semaine code> et statut code>. Ensuite, Ajout de la colonne YPOS code> qui contient la somme cumulative de Nombre code> pour chaque semaine plus 15. Ceci sera utilisé pour la position Y. Pour non expédié code> YPOS code> remplacé par -10. P>

ggplot(dat,aes(as.factor(Week),fill=Status))+geom_bar()+
  geom_text(data=text.df,aes(x=as.factor(Week),y=ypos,label=count))


0 commentaires

3
votes

Sur la base de la parcelle Didzis, vous pouvez également augmenter la lisibilité en gardant la position sur la constante de l'axe Y et en colorant le texte de la même couleur que la légende.

library(ggplot2)
week <- sample(0:5,1000,rep=TRUE,prob=c(0.2,0.05,0.15,0.5,0.03,0.1))
statuses <- gl(2,1000,labels=c('Not-Shipped', 'Shipped'))
dat <- data.frame(Week = week, Status = statuses)


library(plyr)
text.df<-ddply(dat,.(Week,Status),function(x) data.frame(count=nrow(x)))
text.df$ypos[text.df$Status=="Not-Shipped"]<- -15
text.df$ypos[text.df$Status=="Shipped"]<- -55

p <- ggplot(dat,aes(as.factor(Week),fill=Status))+geom_bar()+
geom_text(data=text.df,aes(x=as.factor(Week),y=ypos,label=count),colour=ifelse(text.df$Status=="Not-Shipped","#F8766D","#00BFC4"))


0 commentaires

11
votes

Vous pouvez utiliser une variante du bien connu Pyramid de la population .

Quelques échantillons Données (code inspiré par la réponse de Didzis Elferts): P>

library("ggplot2")
ggplot(plot.df) + 
  aes(x = as.factor(Week), y = V1, fill = Status) +
  geom_bar(stat = "identity", position = "identity") +
  scale_y_continuous(breaks = 100 *     -1:5, 
                     labels = 100 * c(1, 0:5)) +
  geom_text(aes(y = sign(V1) * max(V1) / 30, label = abs(V1)))


0 commentaires