【问题标题】:Create a plot with time on the x- and y-axis (in R)在 x 轴和 y 轴上创建一个带有时间的图(在 R 中)
【发布时间】:2017-11-08 16:27:32
【问题描述】:

有两个时间点(两个测量值),我想在 x 轴上绘制第一个时间点,在 y 轴上绘制第二个时间点,因此我可以轻松检查 45° 以上的数据点- 在第一次之后进行第二次测量的线(对于大多数情况,但不是所有情况都是如此)并评估从第一个时刻经过的时间。

因此,我有两列带有日期,我可以将它们转换为 datedate-time 对象。我现在无法估计,哪种格式可能更容易实现情节。

D = data.frame(time1 = c("2007-06-22","2007-05-22","2007-05-23"), time2 = c("2007-06-22","2007-05-24","2007-06-05"))
D$time1 <- strptime(D$time1, format = "%Y-%m-%d")
D$time2 <- strptime(D$time2, format = "%Y-%m-%d")
class(D$time1)
D$time1 <- as.Date(D$time1, format = "%Y-%m-%d")
class(D$time1)

我需要一些简单的东西:

plot(D$time1, D$time2)

但我还需要一个可修改的版本,它不会绘制日期,但允许休息(周、月、年),比如月。

非常感谢您的想法。

解决方案:两个版本原则上都有效。我选择了ggplot,因为在标签等方面更灵活。我提前进行了数据清理,所以在对缺失数据进行子集化后,我使用了:

library( ggplot2 )
ggplot( mydata, aes(x=t0, y=t1) ) + geom_point() +
  scale_x_date(date_labels = "%b %y", date_breaks = "3 month") +
  scale_y_date(date_labels = "%b %y", date_breaks = "3 month") 

3 个月对于我 2 年的数据来说是一个很好的休息时间。这是我的解决方案:

【问题讨论】:

  • 您可能会抑制默认轴,然后使用axis.Date() 使用基本图形在您想要的任何位置绘制自己的轴。你的草图正是你想要的吗?两个月和一年?这些标签应该准确地出现在哪里?
  • 这只是一个简单的例子,最后,我想要给定年份的所有月份...... :D 我有大约 2-3 年的数据我想说明,也许每月合适。问候

标签: r datetime plot strptime as.date


【解决方案1】:

ggplot 理解时间/日期数据。使用 Date 类,就像您在问题中所做的那样:

D <- data.frame( time1 = as.Date(c("2007-06-22","2007-05-22","2007-05-23")),
                time2 = as.Date(c("2007-06-22","2007-05-24","2007-06-05")) )

现在您可以将其传递给ggplot,使用scale_x_datescale_y_date 来实现指定中断/标签/等的灵活性:

library( ggplot2 )
ggplot( D, aes(x=time1, y=time2) ) + geom_point() +
    scale_x_date( date_labels = "%b %d", date_breaks = "1 week") +
    scale_y_date( date_labels = "%b %d", date_breaks = "1 day" )

更多信息请参见?scale_x_date

【讨论】:

  • 谢谢你们两个 :) 两个版本都有效,但我更灵活地使用带有标签、颜色和设计的 ggplot。我也不需要缓冲axis_scale,但可以轻松切换。根据我的数据,3 个月的休息时间很好。
【解决方案2】:

你可以这样做:

dates_axis <- as.Date(strptime(c("2007-01-01","2007-12-01"), format = "%Y-%m-%d"))
dates_axis <- seq.Date(dates_axis[1],dates_axis[2],"month")

oldpar <- par()
par(mar = c(6,6,1,1))
plot(dates_axis,dates_axis,
    xaxt = "n",
    yaxt = "n",
    bty = "n",
    type = "n",
    xlab = "",
    ylab = "")
axis(1, at = dates_axis, labels = months(dates_axis), las = 2)
axis(2, at = dates_axis, labels = months(dates_axis), las = 1)
points(D$time1, D$time2, pch = 20)
abline(a = 0, b = 1)
par(oldpar)

【讨论】:

  • 我尝试根据我的数据调整您的解决方案。正如我上面提到的。该解决方案在 1 月/2 月的情况下非常手工制作。我有至少 2 年的数据,比如应该显示 24 个月。如何为给定的时间间隔创建 dates_axis?
  • 我已经编辑了我的解决方案,你可以在第一行as.Date(strptime(c("2007-01-01","2007-12-01"), format = "%Y-%m-%d"))更改轴的范围。
  • 好的。现在对于我的真实数据,我遇到了一个新的小问题。在第二个时间点有一些 NA(有些人还没有完成研究)。我可以只为“完整案例”修改point 吗?谢谢
  • 试试with(D[!is.na(D$time1) &amp; !is.na(D$time2),], points(time1, time2, pch = 20))
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多