Affichage des valeurs de données sur un graphique à barres empilées dans ggplot2

Je voudrais afficher les valeurs de données sur un graphique à barres empilées dans ggplot2. Voici ma tentative de code

Year <- c(rep(c("2006-07", "2007-08", "2008-09", "2009-10"), each = 4)) Category <- c(rep(c("A", "B", "C", "D"), times = 4)) Frequency <- c(168, 259, 226, 340, 216, 431, 319, 368, 423, 645, 234, 685, 166, 467, 274, 251) Data <- data.frame(Year, Category, Frequency) library(ggplot2) p <- qplot(Year, Frequency, data = Data, geom = "bar", fill = Category, theme_set(theme_bw())) p + geom_text(aes(label = Frequency), size = 3, hjust = 0.5, vjust = 3, position = "stack") 

entrer la description de l'image ici

J’aimerais afficher ces valeurs de données au milieu de chaque partie. Toute aide à cet égard sera très appréciée. Merci

À partir de ggplot 2.2.0 étiquettes peuvent facilement être empilées en utilisant position = position_stack(vjust = 0.5) dans geom_text .

 ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency)) + geom_bar(stat = "identity") + geom_text(size = 3, position = position_stack(vjust = 0.5)) 

entrer la description de l'image ici

Notez également que ” position_stack() et position_fill() emstacknt désormais les valeurs dans l’ordre inverse du regroupement, ce qui fait que l’ordre de la stack par défaut correspond à la légende.”


Réponse valide pour les anciennes versions de ggplot :

Voici une approche qui calcule les points médians des barres.

 library(ggplot2) library(plyr) # calculate midpoints of bars (simplified using comment by @DWin) Data <- ddply(Data, .(Year), transform, pos = cumsum(Frequency) - (0.5 * Frequency) ) # library(dplyr) ## If using dplyr... # Data <- group_by(Data,Year) %>% # mutate(pos = cumsum(Frequency) - (0.5 * Frequency)) # plot bars and add text p <- ggplot(Data, aes(x = Year, y = Frequency)) + geom_bar(aes(fill = Category), stat="identity") + geom_text(aes(label = Frequency, y = pos), size = 3) 

Graphique résultant

Comme l’a mentionné hadley, il existe des moyens plus efficaces de communiquer votre message que les étiquettes dans les diagrammes à barres empilés. En fait, les graphiques empilés ne sont pas très efficaces, car les barres (chaque catégorie) ne partagent pas un axe. La comparaison est donc difficile.

Il est presque toujours préférable d’utiliser deux graphiques dans ces instances, partageant un axe commun. Dans votre exemple, je suppose que vous souhaitez afficher le total global et ensuite les proportions que chaque catégorie a consortingbué pour une année donnée.

 library(grid) library(gridExtra) library(plyr) # create a new column with proportions prop <- function(x) x/sum(x) Data <- ddply(Data,"Year",transform,Share=prop(Frequency)) # create the component graphics totals <- ggplot(Data,aes(Year,Frequency)) + geom_bar(fill="darkseagreen",stat="identity") + xlab("") + labs(title = "Frequency totals in given Year") proportion <- ggplot(Data, aes(x=Year,y=Share, group=Category, colour=Category)) + geom_line() + scale_y_continuous(label=percent_format())+ theme(legend.position = "bottom") + labs(title = "Proportion of total Frequency accounted by each Category in given Year") # bring them together grid.arrange(totals,proportion) 

Cela vous donnera un affichage à 2 panneaux comme celui-ci:

Graphique à 2 panneaux empilés verticalement

Si vous souhaitez append des valeurs de fréquence, une table est le meilleur format.