Menampilkan nilai data pada diagram batang bertumpuk di ggplot2

112

Saya ingin menampilkan nilai data pada diagram batang bertumpuk di ggplot2. Ini kode percobaan saya

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

masukkan deskripsi gambar di sini

Saya ingin menunjukkan nilai data ini di tengah setiap bagian. Bantuan apa pun dalam hal ini akan sangat dihargai. Terima kasih

MYaseen208
sumber
Pertanyaan terkait: stackoverflow.com/questions/18994631/…
Tyler Rinker
Bukan tempat yang tepat untuk berdebat, tapi saya bertanya-tanya apakah mungkin terlalu preskriptif tentang hal ini, terutama untuk audiens yang lebih umum. Ini adalah contoh yang bagus - angka menunjukkan persentase yang dapat diingat, yang menghilangkan kebutuhan akan skala yang mungkin kurang dapat diakses oleh pembaca yang kurang melek numerik?
geotheory

Jawaban:

193

Dari ggplot 2.2.0label dapat dengan mudah ditumpuk dengan menggunakan 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))

masukkan deskripsi gambar di sini

Perhatikan juga bahwa " position_stack()dan position_fill()sekarang menumpuk nilai dalam urutan terbalik dari pengelompokan, yang membuat urutan tumpukan default cocok dengan legenda."


Jawaban valid untuk versi yang lebih lama dari ggplot:

Berikut adalah satu pendekatan, yang menghitung titik tengah batang.

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)

Bagan yang dihasilkan

Ramnath
sumber
Terima kasih atas jawaban ini. Saya menggunakannya untuk melakukan penggunaan yang serupa, data.tablebukan plyr, jadi sesuatu seperti ini:Data.dt[,list(Category, Frequency, pos=cumsum(Frequency)-0.5*Frequency), by=Year]
atomicules
Apakah ada cara untuk menambahkan total frekuensi juga?
Pablo Olmos de Aguilera C.
26

Seperti yang disebutkan hadley, ada cara yang lebih efektif untuk mengkomunikasikan pesan Anda daripada label dalam diagram batang bertumpuk. Faktanya, bagan bertumpuk tidak terlalu efektif karena batang (setiap Kategori) tidak berbagi sumbu sehingga sulit untuk membandingkan.

Hampir selalu lebih baik menggunakan dua grafik dalam contoh ini, berbagi sumbu yang sama. Dalam contoh Anda, saya berasumsi bahwa Anda ingin menunjukkan total keseluruhan dan kemudian proporsi yang dikontribusikan setiap Kategori pada tahun tertentu.

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)

Ini akan memberi Anda tampilan 2 panel seperti ini:

Grafik 2 panel yang ditumpuk secara vertikal

Jika Anda ingin menambahkan nilai Frekuensi, tabel adalah format terbaik.

AndrewMinCH
sumber