Ich möchte Datenwerte in einem gestapelten Balkendiagramm in ggplot2 anzeigen. Hier ist mein versuchte 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")
Ich möchte diese Datenwerte in der Mitte jedes Abschnitts anzeigen. Jede Hilfe in dieser Hinsicht wird sehr geschätzt. Vielen Dank
Von ggplot 2.2.0
Beschriftungen können einfach mit position = position_stack(vjust = 0.5)
in geom_text
Gestapelt werden.
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))
Beachten Sie auch, dass "position_stack()
und position_fill()
jetzt die Werte in der umgekehrten Reihenfolge der Gruppierung stapeln, wodurch die Standardstapelreihenfolge mit der Legende übereinstimmt."
Antwort gültig für ältere Versionen von ggplot
:
Hier ist ein Ansatz, der die Mittelpunkte der Balken berechnet.
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)
Wie bereits erwähnt, gibt es effektivere Möglichkeiten, Ihre Nachricht zu kommunizieren, als Beschriftungen in gestapelten Balkendiagrammen. In der Tat sind gestapelte Diagramme nicht sehr effektiv, da die Balken (jede Kategorie) keine gemeinsame Achse haben, sodass der Vergleich schwierig ist.
In diesen Fällen ist es fast immer besser, zwei Diagramme zu verwenden, die eine gemeinsame Achse haben. In Ihrem Beispiel gehe ich davon aus, dass Sie die Gesamtsumme und dann die Anteile jeder Kategorie in einem bestimmten Jahr anzeigen möchten.
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)
Dies gibt Ihnen eine 2-Panel-Anzeige wie folgt:
Wenn Sie Frequenzwerte hinzufügen möchten, ist eine Tabelle das beste Format.