以常见的日月规模绘制单独的年份

时间:2014-04-17 14:57:52

标签: r plot ggplot2 time-series

我想创建一个2012年和2013年夏季气温的时间序列图。

唯一的问题是我希望数据系列在另一个上面绘制一个,这样就可以轻松地比较它们而不是沿着日期轴顺序地进行比较。

temp <- c(22, 22, 26, 23, 18, 20, 18, 17)
date <- as.Date(c("2012-06-01", "2012-07-01","2012-08-01","2012-09-01","2013-06-01","2013-07-01","2013-08-01","2013-09-01"))
year <- as.factor(c("2012", "2012", "2012", "2012","2013", "2013","2013","2013"))

df<- data.frame(temp, date, year)

这是我到目前为止使用ggplot2

的内容
require(ggplot2)
ggplot(df, aes(date, temp, color=year))+
  geom_point()

图表并不需要在x轴上列出完整的日期,事实上,它应该只有月和日,这可能会解决问题,即

df$dayMo <- c("07-01", "07-02","07-03","07-04","07-01","07-02","07-03","07-04")

我没有找到让as.Dateas.POSIXctstrptime)允许这种日月格式的方法。

我也可以采取其他一些创造性的方式来完成这项工作。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果您的基础数据集是临时数据和日期,那么这可以避免操纵原始数据框:

ggplot(df) +
  geom_point(aes(x=strftime(date,format="%m-%d"),
                 y=temp, 
                 color=strftime(date,format="%Y")), size=3)+
  scale_color_discrete(name="Year")+
  labs(x="date")

编辑(对OP&#39评论的回应)。

因此,这将上述方法与Henrik相结合,使用日期而不是x轴的char,并避免修改原始df。

library(ggplot2)
ggplot(df) +
  geom_point(aes(x=as.Date(paste(2014,strftime(date,format="%m-%d"),sep="-")),
                 y=temp, 
                 color=strftime(date,format="%Y")), size=3)+
  scale_color_discrete(name="Year")+
  labs(x="date")

答案 1 :(得分:1)

另一种可能性是创建一个假日期,其中一年与原始“日期”的月份和日期连接在一起。类Date的x变量很容易使用scale_x_date格式化。加载scales包以访问漂亮的中断和格式化函数:labels = date_format(); breaks = date_breaks()。有关其他日期格式,请参阅strptime

library(scales)

df$date2 <- as.Date(paste(2014, format(date, "%m-%d"), sep = "-"))

ggplot(df, aes(date2, temp, color = year)) +
  geom_point() +
  scale_x_date(labels = date_format("%m/%d"))

ggplot(df, aes(date2, temp, color=year)) +
  geom_point() +
  scale_x_date(labels = date_format("%b-%d"),
               breaks = date_breaks("months"))

答案 2 :(得分:0)

如果你想在同一个地块上绘制两年的年份,那么使用dayMo作为你的x值(它们不一定是date个对象)。

df$dayMo<-c("06-01", "07-01","08-01","09-01","06-01", "07-01","08-01","09-01")
ggplot(df, aes(dayMo, temp, color=year))+
  geom_point()