varias leyenda grafico graficas barras r graphics ggplot2

leyenda - Mostrar valores de datos en un gráfico de barras apiladas en ggplot2



leyenda en ggplot2 (2)

Como hadley mencionó, hay maneras más efectivas de comunicar su mensaje que las etiquetas en los gráficos de barras apiladas. De hecho, los gráficos apilados 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:

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

Me gustaría mostrar valores de datos en un gráfico de barras apiladas 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")

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 etiquetas se pueden apilar 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))

También tenga en cuenta que " position_stack() y position_fill() ahora apilan valores en el orden inverso de la agrupación, lo que hace que el orden de pila 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)