Chciałbym pokazać wartości danych na skumulowanym wykresie słupkowym w ggplot2. Oto mój próbowany kod
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")
Chciałbym pokazać te wartości danych w środku każdej części. Każda pomoc w tym zakresie będzie bardzo mile widziana. Dzięki
Odpowiedzi:
Z
ggplot 2.2.0
etykiet można łatwo układać w stosy, używającposition = position_stack(vjust = 0.5)
wgeom_text
.Zauważ również, że „
position_stack()
iposition_fill()
teraz stosuj wartości w odwrotnej kolejności grupowania, co powoduje, że domyślna kolejność stosu jest zgodna z legendą”.Odpowiedź ważna dla starszych wersji
ggplot
:Oto jedno podejście, które oblicza punkty środkowe słupków.
źródło
data.table
zamiastplyr
, więc coś takiego:Data.dt[,list(Category, Frequency, pos=cumsum(Frequency)-0.5*Frequency), by=Year]
Jak wspomniał Hadley, istnieją skuteczniejsze sposoby przekazywania wiadomości niż etykiety na skumulowanych wykresach słupkowych. W rzeczywistości wykresy skumulowane nie są zbyt skuteczne, ponieważ słupki (każda kategoria) nie mają wspólnej osi, więc porównanie jest trudne.
W takich przypadkach prawie zawsze lepiej jest użyć dwóch wykresów, które mają wspólną oś. W twoim przykładzie zakładam, że chcesz pokazać ogólną sumę, a następnie proporcje wniesione przez każdą kategorię w danym roku.
To da ci dwupanelowy wyświetlacz, taki jak ten:
Jeśli chcesz dodać wartości częstotliwości, najlepszym formatem jest tabela.
źródło