Wyświetlanie wartości danych na ułożonym wykresie słupkowym w ggplot2

Chciałbym pokazać wartości danych na wykresie słupkowym w ggplot2. Oto Mój 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") 

Tutaj wpisz opis obrazka

Chciałbym pokazać te wartości danych w środku każdej części. Każda pomoc w tym zakresie będzie wysoko ceniona. Dzięki

Author: MYaseen208, 2011-07-11

2 answers

Od ggplot 2.2.0 etykiety można łatwo układać za pomocą 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))

Tutaj wpisz opis obrazka

Zauważ również, że " position_stack() i position_fill() Teraz stos wartości w odwrotnej kolejności grupowania, co sprawia, że domyślna kolejność stosu pasuje do legendy."


Odpowiedź ważna dla starszych wersji ggplot:

Oto jedno podejście, które oblicza środkowe punkty słupków.

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)

Wykres wynikowy

 127
Author: Ramnath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 16:33:37

Jak hadley wspomniał, istnieją bardziej skuteczne sposoby przekazywania wiadomości niż etykiety na ułożonych wykresach słupkowych. W rzeczywistości ułożone wykresy nie są zbyt skuteczne, ponieważ słupki (każda kategoria) nie mają wspólnej osi, więc porównanie jest trudne.

Prawie zawsze lepiej jest użyć dwóch wykresów w tych przypadkach, dzielących wspólną oś. W twoim przykładzie zakładam, że chcesz pokazać ogólną sumę, a następnie proporcje, które każda kategoria wniosła w danym roku.

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)

To da ci wyświetlacz 2 panelowy taki:

Pionowo ułożona grafika 2 Panelowa

Jeśli chcesz dodać wartości częstotliwości, tabela jest najlepszym formatem.

 17
Author: AndrewMinCH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 05:48:18