Mostrar valores de datos en un gráfico de barras astackdas en ggplot2

Me gustaría mostrar valores de datos en un gráfico de barras astackdas en ggplot2. Aquí está mi código intentado

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

enter image description here

Me gustaría mostrar estos valores de datos en el medio de cada parte. Cualquier ayuda en este asunto será muy apreciada. Gracias

Desde ggplot 2.2.0 tags se pueden astackr fácilmente usando position = position_stack(vjust = 0.5) en 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)) 

enter image description here

También tenga en cuenta que ” position_stack() y position_fill() ahora astackn valores en el orden inverso de la agrupación, lo que hace que el orden de stack predeterminado coincida con la leyenda”.


Respuesta válida para versiones anteriores de ggplot :

Aquí hay un enfoque, que calcula los puntos medios de las barras.

 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) 

Cuadro resultante

Como hadley mencionó, hay maneras más efectivas de comunicar su mensaje que las tags en los gráficos de barras astackdas. De hecho, los gráficos astackdos no son muy efectivos ya que las barras (cada Categoría) no comparten un eje, por lo que la comparación es difícil.

Casi siempre es mejor usar dos gráficos en estas instancias, compartiendo un eje común. En su ejemplo, supongo que desea mostrar el total general y las proporciones que cada categoría aportó en un año determinado.

 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) 

Esto le dará una pantalla de 2 paneles como esta:

Gráfico de 2 paneles apilados verticalmente

Si desea agregar valores de frecuencia, una tabla es el mejor formato.