2012-08-28 66 views
9

我正在使用R創建流行曲線(每天疾病病例數的直方圖)的過程,並且我正在通過格式化x軸來掙扎一點。我知道ggplot給出了非常好的圖形和易於操縱的軸(Understanding dates and plotting a histogram with ggplot2 in R),但在這種情況下,我更喜歡使用hist()命令,因爲我在同一時間描述了兩種不同的模式,如下所示(我不知道「認爲你能做到在ggplot類似)的東西:當使用R處理日期時格式化直方圖x軸

enter image description here

這裏的問題是,X軸不會在第一種情況下開始,有太多的刻度線,我想能夠有系統的日期標記,例如。每7天或每個月的第一天。

的數據被存儲在數據庫中(dat.geo),按照疑似病例的一行,對發病和郊區的日期信息(無論是黑色或白色柱狀圖),如下:

> head(dat.geo) 
    number age sex  suburb Date_of_Onset 
1  1 12 F   x 2011-10-11 
2  2 28 M   x 2011-10-10 
3  3 15 F   x 2011-10-12 
4  4 12 M   y 2011-10-25 
5  5 10 F   x 2011-10-15 
6  6 9 M   y 2011-10-20 

這裏是我的代碼:

pdf(file='1.epi.curve.pdf') 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="x")], "days", 
format = "%d %b %y", freq=T, col=rgb(0,0,0,1), axes=T, main="", add=T) 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="y")], "days", 
format = "%d %b %y", freq=T, main="", col=rgb(1,1,1,.6), add=T, axes=F) 
dev.off() 

我試圖抑制軸,後來加入了操縱一個使用此代碼

axis(1, labels=T) 
axis(2) 

,但是這是我得到的(我不知道如何操作這些):

enter image description here

你的幫助是極大的讚賞!

感謝

+0

使用'axis(1,at = x,labels = y)'其中'x'是刻度的座標(數字向量),'y'是刻度標籤(字符向量)。 – Backlin

+0

您可以在'ggplot'中使用'position =「identity」'覆蓋條形碼 – James

回答

16

既然你有效地激勵我們要提供一個ggplot的解決方案,那就是:

dates <- seq(as.Date("2011-10-01"), length.out=60, by="+1 day") 

set.seed(1) 
dat <- data.frame(
    suburb <- rep(LETTERS[24:26], times=c(100, 200, 300)), 
    Date_of_Onset <- c(
    sample(dates-30, 100, replace=TRUE), 
    sample(dates, 200, replace=TRUE), 
    sample(dates+30, 300, replace=TRUE) 
) 
) 

library(scales) 
library(ggplot2) 
ggplot(dat, aes(x=Date_of_Onset, fill=suburb)) + 
    stat_bin(binwidth=1, position="identity") + 
    scale_x_date(breaks=date_breaks(width="1 month")) 

注意使用position="identity"迫使各條發源於軸,否則你會得到一個堆疊圖表默認情況下。

enter image description here

+0

感謝您的努力 - 這看起來不錯,但我更喜歡原始解決方案,因爲您可以看到它們中的兩條曲線整體。我會記住這種技術以備將來使用,但 –

+0

@jpolonsky您能解釋一下您能夠*看到兩條曲線的完整*嗎?你打算堆疊酒吧嗎?或躲閃酒吧?或者是其他東西?這些選項中的任何一個都可能在'ggplot'中。 – Andrie

+1

我的歉意,我剛剛看到,通過添加alpha = 0.5到stat_bin命令,你可以得到幻燈片,這真的是我以後。感謝這個出色的解決方案! –

8

有2級可用的解決方案; 1使用HIST()和另一個使用ggplot():

library(date) 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="x")], "weeks", 
format = "%d %b %y", freq=T, col=rgb(0,0,0,1), axes=F, main="") 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="y")], "weeks", 
format = "%d %b %y", freq=T, main="", col=rgb(1,1,1,.6), add=T, axes=F) 
axis.Date(1, at=seq(as.Date("2011-10-10"), as.Date("2012-03-19"), by="2 weeks"), 
format="%d %b %y") 
axis.Date(1, at=seq(as.Date("2011-10-10"), as.Date("2012-03-19"), by="weeks"), 
labels=F, tcl= -0.5) 

這流行曲線是如下:

enter image description here

使用ggplot的溶液,由上述Andrie建議的,如下:

library(scales) 
library(ggplot2) 
ggplot(dat.geo,aes(x=Date_of_Onset, group=suburb, fill=suburb))+ 
stat_bin(colour="black", binwidth=1, alpha=0.5, 
position="identity") + theme_bw()+ 
xlab("Date of onset of symptoms")+ 
ylab("Number of cases")+ 
scale_x_date(breaks=date_breaks("1 month"), labels=date_format("%b %y")) 

其給出如下一種流行病曲線:

enter image description here