【问题标题】:How do I scale dates correctly on x-axys when doing time-series graph using ggplot2 in R?在 R 中使用 ggplot2 进行时间序列图时,如何在 x 轴上正确缩放日期?
【发布时间】:2018-07-06 19:17:31
【问题描述】:
#create the data 
library(ggplot2)
data <- data.frame(
  Date = c("2000", "2002", "2003", "2006",
       "2007", "2008", "2000", "2002",
       "2003", "2011", "2012", "2014"),
  EUR = c(1.0155, 1.0309, 1.0335, 1.0324, 1.0294, 1.0252, 1.0322,
      1.0281, 1.027, 1.0128, 1.0121, 1.0115),
  Company=c(rep(c(1),6),rep(c(2),6))
)

#check the data
str(data)

# convert date column to Date as it is currently a **factor**
data$Date <- as.Date(as.character(data$Date))

#basic plot
ggplot(data,aes(Date, EUR, colour=Company, group=Company)) + geom_line()+ geom_point()

正如您在图表中看到的,2003 年和 2006 年之间的空间与 2011 年和 2012 年之间的空间相同。有没有办法显示正确/按比例缩放的年份!?

【问题讨论】:

  • 问题是您的Datecolumn 不是Date 类的对象。你必须做类似data$Date &lt;- as.Date(paste(as.character(data$Date), "1", "1", sep = "-"))的事情。

标签: r date ggplot2 time-series


【解决方案1】:

就像 Rui 指出的那样,data$Date 实际上并不是一个 Date 对象。使用函数 as.POSIXct() 将正确地将您的初始字符值转换为 POSIX 时间。然后scale_x_datetime() 可以帮助格式化您的 ggplot 轴。

# use POSIXct() and specify format; see ?strptime() for help on formats
data$Date <- as.POSIXct(data$Date, format = "%Y")

# for plotting porpoises
data$Company <- as.factor(data$Company)

# now with scale_x_datetime to give sensical breaks and labels
ggplot(data,aes(Date, EUR, colour = Company)) +
    geom_line() + geom_point() +
    scale_x_datetime(date_breaks = "2 years", date_labels = "%Y")

如果您想让所有点都与年份刻度对齐,那么您需要将日期指定为 X 年的 1 月 1 日。您可以使用此代码代替原来的as.POSIXct() 行:

data$Date <- as.POSIXct(paste0("01-01-", data$Date), format = "%m-%d-%Y")

小心不要运行两次as.POSIX() 转换(选择一个),否则您将不喜欢得到的结果。

【讨论】:

  • 谢谢@Nate!这很好用!但是,当我将此图放在 Shiny 应用程序中时,突然间我收到一个错误“必须提供'原点'”。据我了解,它指的是 as.POSIXct 的“原点”参数。但是当我添加参数 origin="1960-10-01" (或者我也尝试过 origin="1970-01-01")时,我的年份被转换成完全不同的数字。 (如 33-37)。对此有什么建议吗?我很困惑为什么 as.POSIXct 在从独立 r 脚本调用时不请求 origin 参数,但在 Shiny 应用程序中的工作方式不同。谢谢! :)
  • 不客气。如果没有完整的代码,很难说出导致该错误消息的原因。 Here 是在 Shiny 应用程序中运行的相同代码/数据的工作示例。如果这没有帮助,请发送minimal reproducible example 并简单地询问这是一个新问题。 #SOhappytohelp
  • 谢谢@Nat!那确实有帮助。我能够得到与您相同的图表。但是,我注意到在您的图表上(也在我的图表上) - 数据点向右移动,看起来不太好。 (澄清一下,与年份相对应的数据点不是在年份旁边,而是在右边。)你碰巧知道为什么吗?谢谢!!!
  • 是的,问题是as.POSIXct() 是使用系统时间来填写月份和日期,所以您看到的偏移量是否可能是因为您现在的日期列中确实是 2018 年 1 月 30 日,您可以通过data$Date查看自己。我会进行编辑并告诉你如何解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2021-06-24
相关资源
最近更新 更多