Ggplot2'de yığılmış çubuk grafikte veri değerleri gösteriliyor


112

Ggplot2'deki yığılmış çubuk grafikteki veri değerlerini göstermek istiyorum. İşte denenen kodum

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

görüntü açıklamasını buraya girin

Bu veri değerlerini her bölümün ortasında göstermek istiyorum. Bu konudaki herhangi bir yardım çok takdir edilecektir. Teşekkürler



Gerçekten bir tartışma yeri değil, ama bu konuda aşırı kuralcı olmanın mümkün olup olmadığını merak ediyorum, özellikle daha genel izleyici kitlesi için. Bu güzel bir örnek - sayılar hatırlanabilen yüzdeleri ifade ediyor, bu da daha az sayısal okuryazar okuyucuların daha az erişilebilir bulabileceği bir ölçeğe olan ihtiyacı ortadan kaldırıyor mu?
geotheory

Yanıtlar:


193

Gönderen ggplot 2.2.0etiketleri kolayca kullanarak yığılmış edilebilir position = position_stack(vjust = 0.5)içinde 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))

görüntü açıklamasını buraya girin

Ayrıca şunu unutmayın "position_stack() ve position_fill()şimdi değerleri gruplamanın tersi sırasına göre yığınlayın, bu da varsayılan yığın sırasının göstergeyle eşleşmesini sağlar."


Yanıt eski sürümleri için geçerlidir ggplot :

Çubukların orta noktalarını hesaplayan bir yaklaşım.

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)

Sonuç tablosu


Bu cevap için teşekkürler. Bunun data.tableyerine benzerini kullanmak için kullandım plyr, yani Data.dt[,list(Category, Frequency, pos=cumsum(Frequency)-0.5*Frequency), by=Year]
şuna

Sıklık toplamını da eklemek için bir yol var mı?
Pablo Olmos de Aguilera C.

26

Hadley'in de bahsettiği gibi, mesajınızı iletmenin yığılmış çubuk grafiklerdeki etiketlerden daha etkili yolları vardır. Aslında, çubuklar (her Kategori) bir ekseni paylaşmadığından, karşılaştırma yapmak zordur, yığılmış grafikler çok etkili değildir.

Bu durumlarda ortak bir ekseni paylaşan iki grafik kullanmak neredeyse her zaman daha iyidir. Örneğinizde, genel toplamı ve ardından belirli bir yılda her Kategorinin katkıda bulunduğu oranları göstermek istediğinizi varsayıyorum.

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)

Bu size aşağıdaki gibi 2 panelli bir ekran verecektir:

Dikey olarak istiflenmiş 2 panel grafik

Frekans değerleri eklemek istiyorsanız, bir tablo en iyi biçimdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.