在ggplot水平条形图中格式化日期

3

我想使用ggplot制作一个横向的条形图,x轴上是日期。以下是我的代码:

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

问题是如何将日期限制从1月到12月,并在每个月的第一天打勾?

我尝试了几种方法,例如:

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

感谢您的帮助。

错误信息不清楚吗?POSIXct类不是Date类。 - Roland
另一个问题是您使用了scale_x_datetime(),但应该使用scale_y_date() - 您的日期在y轴上,然后才翻转到x轴上,因此在翻转之前进行了比例尺格式化。 - Didzis Elferts
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接