webentwicklung-frage-antwort-db.com.de

Anzeigen von Datenwerten in einem gestapelten Balkendiagramm in ggplot2

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

enter image description here

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

96
MYaseen208

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

enter image description here

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)

Resultant chart

161
Ramnath

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:

Vertically stacked 2 panel graphic

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

22
AndrewMinCH