2015-02-17 13 views
6

Hadley Wickham'ın kitabını ggplot hakkında okuyorum, ancak bir çubuk grafikte zaman içinde belirli ağırlıklar çizmekte güçlük çekiyorum. Burada örnek veriler şunlardır:zaman serileri için ggplot çubuk grafiği

dates <- c("20040101","20050101","20060101") 
dates.f <- strptime(dates,format="%Y%m%d") 

m <- rbind(c(0.2,0.5,0.15,0.1,0.05),c(0.5,0.1,0.1,0.2,0.1),c(0.2,0.2,0.2,0.2,0.2)) 
m <- cbind(dates.f,as.data.frame(m)) 

Bu data.frame birinci sütunda yer alır tarih ve her sıra tekabül eden moleküler ağırlıklar. Her yıl için ağırlıkları "dolgu" argümanı kullanılarak bir çubuk grafikte çizmek istiyorum.

kullanıyorum çubukları gibi ağırlıkları arsa mümkün değilim:

p <- ggplot(m,aes(dates.f)) 
p+geom_bar() 

Ancak bu istediğim tam olarak bu değildi. Her barda, her ağırlığın katkısını görmek isterim. Dahası, neden x ekseni üzerinde garip bir formata sahip olduğumu anlamıyorum, yani "2004-07" ve "2005-07" neden görüntüleniyor.

ggplot2 uzun formatta veri gerektirir: Yardım

cevap

3

Umut bunun için

sayesinde aradığınız budur. kendini çizme

require(reshape2) 
m_molten <- melt(m, "dates.f") 

sonra yan yana isterseniz geom_bar için position="dodge" ekleyebilir

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
    geom_bar(stat="identity") 

enter image description here

tarafından yapılır.

DÜZENLEME Eğer yıllık sonları sadece istiyorsanız

: Bugüne kadar m_molten$dates.f dönüştürün.

require(scales) 
m_molten$dates.f <- as.Date(m_molten$dates.f) 

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
    geom_bar(stat="identity") + 
    scale_x_date(labels = date_format("%y"), breaks = date_breaks("year")) 

P.S. .: düzenli veri Hadley'in felsefesi için http://vita.had.co.nz/papers/tidy-data.pdf bakınız.

+0

! çok teşekkürler! – math

+0

belki bir küçük soru: 'scale_x_date (lables = date_format ("% y")) 'ile etiketleri değiştirmek istedim. Bu, date_format işlevini bulamadığı bir hatadır. 04, 05,06'yı nasıl görüntüleyebilirim? – math

+0

yukarıdaki düzenlemeye bakın. – Rentrop

1

İhtiyacınız olan arsa oluşturmak için, verilerinizi "geniş" ten "uzun" olarak yeniden biçimlendirmeniz gerekir. Bunu yapmak için pek çok yol vardır, bunlara reshape() işlevi baz R (önerilmez), reshape2 ve tidyr dahildir.

tidyr paketinde, verileri yeniden şekillendirmek için iki işlevi vardır, gather() ve spread().

gather() işlevi, genişten büyüğe doğru dönüşür. Bu durumda, sütunlarınızı V1:V5 toplamanız gerekir.

bu deneyin: Tam olarak

library("tidyr") 

tidy_m <- gather(m, var, value, V1:V5) 

ggplot(tidy_m,aes(x = dates.f, y=value, fill=var)) + 
    geom_bar(stat="identity") 

enter image description here

İlgili konular