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)