Anzeigen von Datenwerten im gestapelten Balkendiagramm in ggplot2

112

Ich möchte Datenwerte auf einem gestapelten Balkendiagramm in ggplot2 anzeigen. Hier ist mein versuchter 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") 

Geben Sie hier die Bildbeschreibung ein

Ich möchte diese Datenwerte in der Mitte jedes Abschnitts anzeigen. Jede Hilfe in dieser Hinsicht wird sehr geschätzt. Vielen Dank

MYaseen208
quelle
Verwandte Frage: stackoverflow.com/questions/18994631/…
Tyler Rinker
Nicht wirklich der Ort für eine Debatte, aber ich frage mich, ob es möglich ist, dies zu genau zu beschreiben, insbesondere für das allgemeinere Publikum. Dies ist ein schönes Beispiel : Zahlen bezeichnen Prozentsätze, an die man sich erinnern kann, wodurch die Notwendigkeit einer Skala entfällt, die für Leser mit weniger numerischen Kenntnissen möglicherweise weniger zugänglich ist.
Geotheory

Antworten:

193

Von ggplot 2.2.0Etiketten können leicht unter Verwendung gestapelt werden position = position_stack(vjust = 0.5)in 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))

Geben Sie hier die Bildbeschreibung ein

Beachten Sie außerdem, dass " position_stack()und position_fill()jetzt Stapelwerte in umgekehrter Reihenfolge der Gruppierung vorliegen, 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)

Resultierendes Diagramm

Ramnath
quelle
Danke für diese Antwort. Ich habe es benutzt, um ähnliche Dinge zu tun, data.tableanstatt plyrso etwas wie:Data.dt[,list(Category, Frequency, pos=cumsum(Frequency)-0.5*Frequency), by=Year]
Atomicules
Gibt es sowieso auch die Frequenzsumme zu addieren?
Pablo Olmos de Aguilera C.
26

Wie Hadley bereits erwähnt hat, gibt es effektivere Möglichkeiten zur Kommunikation Ihrer Nachricht als Beschriftungen in gestapelten Balkendiagrammen. In der Tat sind gestapelte Diagramme nicht sehr effektiv, da die Balken (jede Kategorie) keine Achse gemeinsam haben, sodass ein 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 anzeigen möchten, die jede Kategorie in einem bestimmten Jahr beigetragen hat.

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)

Dadurch erhalten Sie eine 2-Panel-Anzeige wie folgt:

Vertikal gestapelte 2-Panel-Grafik

Wenn Sie Frequenzwerte hinzufügen möchten, ist eine Tabelle das beste Format.

AndrewMinCH
quelle