2016-09-14 1 views
1

J'ai cette barre graphique:question geom_bar empilés avec barres empilées et étiquettes mal placé

group = c("A","A","B","B") 
value = c(25,-75,-40,-76) 
day = c(1,2,1,2) 
dat = data.frame(group = group , value = value, day = day) 

ggplot(data = dat, aes(x = group, y = value, fill = factor(day))) + 
    geom_bar(stat = "identity", position = "identity")+ 
    geom_text(aes(label = round(value,0)), color = "black", position = "stack") 

enter image description here

et je voudrais les barres empilées et les valeurs à se manifester. Quand je cours le code ci-dessus le -76 n'est pas dans l'emplacement correct (et le 75 ne semble pas non plus).

Une idée de comment obtenir les numéros à apparaître dans l'emplacement correct?

+0

Vous devriez faire attention à l'avertissement: 'message d'avertissement: Empilement pas bien défini quand ymin = 0' dire que vous faites un graphique confus!. – alistaire

+0

Pourquoi utilisez-vous 'position =" identity "' dans 'geom_bar' si vous voulez que les barres soient empilées? – Axeman

+0

Egalement @alistaire, je ne reçois pas cet avertissement, en cours d'exécution '2.1.0.9000'. – Axeman

Répondre

1
ggplot(data=dat, aes(x=group, y=value, fill=factor(day))) + 
    geom_bar(stat="identity", position="identity")+ 
    geom_text(label =round(value,0),color = "black")+ 
    scale_y_continuous(breaks=c(-80,-40,0)) 

enter image description here

+1

OP serait "comme les barres empilées". Si vous n'êtes pas d'accord, vous devriez au moins l'expliquer dans la réponse. – Axeman

0

Empilement un mélange de valeurs négatives et positives est difficile pour ggplot2. Le plus simple est de diviser le jeu de données en deux, un pour les positifs et un pour les négatifs, puis d'ajouter des couches de barres séparément. Un exemple classique est here.

Vous pouvez faire la même chose avec le texte, en ajoutant un calque de texte pour les valeurs y positives et un pour les négatifs.

dat1 = subset(dat, value >= 0) 
dat2 = subset(dat, value < 0) 

ggplot(mapping = aes(x = group, y = value, fill = factor(day))) + 
    geom_bar(data = dat1, stat = "identity", position = "stack")+ 
    geom_bar(data = dat2, stat = "identity", position = "stack") + 
    geom_text(data = dat1, aes(label = round(value,0)), color = "black", position = "stack") + 
    geom_text(data = dat2, aes(label = round(value,0)), color = "black", position = "stack") 

enter image description here

Si vous utilisez la version actuellement semble développement de ggplot2 (2.1.0.9000), l'empilement ne pas fonctionner correctement dans geom_text pour les valeurs négatives. Vous pouvez toujours calculer les positions de texte "à la main" si nécessaire.

library(dplyr) 
dat2 = dat2 %>% 
    group_by(group) %>% 
    mutate(pos = cumsum(value)) 

ggplot(mapping = aes(x = group, y = value, fill = factor(day))) + 
    geom_bar(data = dat1, stat = "identity", position = "stack")+ 
    geom_bar(data = dat2, stat = "identity", position = "stack") + 
    geom_text(data = dat1, aes(label = round(value,0)), color = "black") + 
    geom_text(data = dat2, aes(label = round(value,0), y = pos), color = "black")