2013-07-24 48 views
3

我想使用ggplot在x軸上創建一個水平條形圖。這裏是我有的代碼:在ggplot水平條形圖中格式化日期

df <- data.frame(patient= c('Harry','John'), pain_date = c(as.POSIXct('13-04-2000', format = '%d-%m-%Y'), as.POSIXct('12-02-2000', format = '%d-%m-%Y')), agony_date = c(as.POSIXct('25-05-2000', format = '%d-%m-%Y'),as.POSIXct('21-05-2000', format = '%d-%m-%Y')), death_date = c(as.POSIXct('30-06-2000', format = '%d-%m-%Y'), as.POSIXct('23-11-2000', format = '%d-%m-%Y'))) 
ggplot(df, aes(x=patient)) + 
geom_linerange(aes(ymin=pain_date, ymax=agony_date), color="red", size=5) + 
geom_linerange(aes(ymin=agony_date, ymax=death_date), color="black", size=5) + 
coord_flip() 

問題是如何解決從JAN到DEC的限制以及如何在每個月的第一天打勾?

我已經試過幾件事情,如:

scale_x_datetime(major="months") 
scale_x_datetime(lim = c(as.POSIXct("01-01-2000"), as.POSIXct("31-12-2000"))) 

,但它給了我下面的錯誤信息:

Erreur : Invalid input: date_trans works with objects of class Date only 

感謝您的幫助

+0

錯誤信息不清楚嗎?類POSIXct不是類Date。 – Roland

+0

另一個問題是,你使用scale_x_datetime(),但應該使用scale_y_date() - 你的日期是在y軸上,然後才用x翻轉,因此縮放在翻轉之前被格式化。 –

回答

4

總結上述意見,你的代碼應該看起來像這樣:

require(scales) 
df[, "pain_date"] <- as.Date(df[, "pain_date"]) 
df[, "agony_date"] <- as.Date(df[, "agony_date"]) 
df[, "death_date"] <- as.Date(df[, "death_date"]) 

ggplot(df, aes(x=patient)) + 
    geom_linerange(aes(ymin=pain_date, ymax=agony_date), color="red", size=5) + 
    geom_linerange(aes(ymin=agony_date, ymax=death_date), color="black", size=5) + 
    coord_flip() + scale_y_date(lim = c(as.Date("2000-01-01"), as.Date("2000-12-31")), 
           breaks=date_breaks(width = "1 month"))