在散点图中定义日期x轴(R)

时间:2017-05-18 23:31:22

标签: r date ggplot2

我想生成一个具有日期列的数据框的散点图。 x轴应按月划分,或者在过去2年中每2个月划分一次。

数据框:

code_1000 <-
  as.data.frame(cbind(
    c("3", "3", "7", "7", "7", "7", "2", "2", "4", "4"),
    c("344", "344", "73", "73", "71", "72", "21", "27", "42", "43"),
    c("9-02-2017", "10-01-2016","9-02-2014", "25-03-2015", "9-02-2017",
      "10-06-2017", "8-04-2017", "25-08-2016", "07-08-2017", "15-09-2016"
    )
  ))
names(code_1000) <- c("number", "code", "date")

情节代码:

qplot(data=code_1000,
      x=format(as.Date(date),"%b/%Y"), 
      y=code,
      geom=c("point"),
      na.rm=TRUE,
      xlab="Emission date", ylab="Code",
      size=1, col=2)+theme_bw()+theme(legend.position="none")

我想在y轴上绘制code,在x轴上绘制date。如何强制x轴按月划分?此外,当我运行我的绘图代码时,x轴格式看起来像mm / dddd,但我想要mm / yyyy。我为什么要这种格式?

我在Shiny应用程序中有大约50个数据框,如code_1000。为了简单起见,我没有共享所有代码。

提前谢谢你们!

3 个答案:

答案 0 :(得分:1)

我认为默认的日期解析器只是被您的DD-MM-YYY符号搞糊涂了。 如果使用lubridate解析日期,则x轴看起来更合理(尽管可能没有您想要的主要/次要刻度。)

我删除了你重新格式化qplot中的日期并添加了缩放功能。

library(lubridate)
library(scales)

# implicit in poster's question
library(ggplot2)

code_1000$date <- lubridate::dmy(as.character(code_1000$date))

qplot(
  data = code_1000,
  x = date,
  y = code,
  geom = c("point"),
  na.rm = TRUE,
  xlab = "Emission date",
  ylab = "Code",
  size = 1,
  col = 2
) + theme_bw() + theme(legend.position = "none") + scale_x_date(
  date_breaks = "1 year",
  date_minor_breaks = "1 month",
  labels = date_format("%m-%Y")
)

enter image description here

答案 1 :(得分:0)

我的解决方案最终与上面的@MarkMiller非常相似,只是我对lubridate的尝试失败了。我使用strptime来转换日期。

code_1000$date <- strptime(code_1000$date, format = "%d-%M-%Y")

我发现ggplot功能更灵活,更简洁,而不是qplot。特别是在一个闪亮的应用程序中,qplot可能会给出可变结果(?):

library(tidyverse)
library(scales) # needed for date_format()
ggplot(code_1000, aes(date, code)) +
  geom_point(size=2, col="steelblue") + 
  theme_bw() +
  labs(x="Emission Date", y="Code") +
  scale_x_datetime(labels = date_format("%m/%Y")) 

如果要在闪亮图表中设置限制一致,请设置特定时间限制:

limits <- strptime(c("01-01-2014", "01-01-2018"), format = "%d-%m-%Y")
ggplot(code_1000, aes(date, code)) +
  geom_point(size=2, col="steelblue") + theme_bw() +
  labs(x="Emission Date", y="Code") +
  scale_x_datetime(labels = date_format("%m-%Y"), #minor_breaks = "1 month"
                   date_breaks = "1 year", limits = as.POSIXct(limits))

答案 2 :(得分:0)

非常感谢你的回答!

我很难在Shiny中为我的数据帧应用这种日期格式。

我有51个不同的数据框,而不是一个数据框code_1000,从code_1000code_1050命名。我想应用这种日期格式

code_1000$date <- lubridate::dmy(as.character(code_1000$date))

在这些数据框架中的所有date列上。我试图使用for来做,但它变得有点混乱,没有用。

for (m in 1:nrow(input)){

  assign(paste0("code_",input$code.numbers[m])$date, lubridate::dmy(as.character(eval(parse(text=paste0("code_",input$code.numbers[m])))$date)))

    }

input$code.numbers是一个数据框,其中包含命名数据帧的数字(从1000到1050)。我收到以下错误:

Error in paste0("code_",input$code.numbers[m])$date : 
  $ operator is invalid for atomic vectors

我想了解如何使用forlapply()函数执行此操作,因为我已经读过,在R lapply()中,大多数情况下这是一种更简单的方法。