【问题标题】:Histogram of events grouped by month and day按月和日分组的事件直方图
【发布时间】:2014-10-09 11:39:17
【问题描述】:

我正在尝试从多年的一组数据中制作每个事件发生次数的直方图(或其他图),但按月和日分组。基本上我想要从 3 月 1 日开始的一年长的 x 轴,显示每个日期出现的次数,并根据分类值对这些日期进行着色。以下是数据集中的前 20 个条目:

goose

Index   DateLost    DateLost1   Nested
1   2/5/1988    1988-02-05  N
2   5/20/1988   1988-05-20  N
3   1/31/1985   1985-01-31  N
4   9/6/1997    1997-09-06  Y
5   9/24/1996   1996-09-24  N
6   9/27/1996   1996-09-27  N
7   9/15/1997   1997-09-15  Y
8   1/18/1989   1989-01-18  Y
9   1/12/1985   1985-01-12  Y
10  2/12/1988   1988-02-12  N
11  1/12/1985   1985-01-12  Y
12  10/26/1986  1986-10-26  N
13  9/15/1988   1988-09-15  Y
14  12/30/1986  1986-12-30  N
15  1/19/1991   1991-01-19  N
16  1/7/1992    1992-01-07  N
17  10/9/1999   1999-10-09  N
18  10/20/1990  1990-10-20  N
19  10/25/2001  2001-10-25  N
20  9/23/1996   1996-09-23  Y

我尝试过使用 strftime、zoo 和 lubridate 进行分组,但是这些图无法识别时间顺序,也无法让我调整起始值。我尝试了许多使用 plot() 和 ggplot2() 的方法,但要么无法正确绘制分组数据,要么无法将数据分组。到目前为止,我最好的情节来自这段代码:

ggplot(goose, aes(x=DateLost1,fill=Nested))+ stat_bin(binwidth=100 ,position="identity") + scale_x_date("Date")

这给了我一个很好的情节,但多年来,而不是一年。我还在这里使用了先前答案中的代码: Understanding dates and plotting a histogram with ggplot2 in R 但是在选择开始日期时遇到了麻烦。任何帮助将不胜感激。如果我能以更易于使用的格式提供示例数据,请告诉我。

【问题讨论】:

  • dput() 可以很好地格式化数据以包含在问题中。此外,与其使用 lubridate,不如坚持使用 POSIXct 格式。然后,您可以将年、月或日作为单独的列。然后你可以使用paste0("2001-", month -", "day") 之类的东西创建一个虚拟日期,并将其用作你的 x。

标签: r date ggplot2 histogram


【解决方案1】:

让我们读入你的数据:

goose <- read.table(header = TRUE, text = "Index   DateLost    DateLost1   Nested
1   2/5/1988    1988-02-05  N
2   5/20/1988   1988-05-20  N
3   1/31/1985   1985-01-31  N
4   9/6/1997    1997-09-06  Y
5   9/24/1996   1996-09-24  N
6   9/27/1996   1996-09-27  N
7   9/15/1997   1997-09-15  Y
8   1/18/1989   1989-01-18  Y
9   1/12/1985   1985-01-12  Y
10  2/12/1988   1988-02-12  N
11  1/12/1985   1985-01-12  Y
12  10/26/1986  1986-10-26  N
13  9/15/1988   1988-09-15  Y
14  12/30/1986  1986-12-30  N
15  1/19/1991   1991-01-19  N
16  1/7/1992    1992-01-07  N
17  10/9/1999   1999-10-09  N
18  10/20/1990  1990-10-20  N
19  10/25/2001  2001-10-25  N
20  9/23/1996   1996-09-23  Y")

现在我们可以将其转换为 POSIXct 格式:

goose$DateLost1 <- as.POSIXct(goose$DateLost,
                              format = "%m/%d/%Y", 
                              tz = "GMT")

那么我们需要弄清楚它是在哪一年丢失的,相对于 3 月 31 日。不要尝试在ggplot() 中执行此操作。这需要花点时间弄清楚我们在哪一年,然后计算 3 月 31 日之后的天数。

goose$DOTYMarch1 = as.numeric(format(as.POSIXct(paste0("3/1/",format(goose$DateLost1,"%Y")),
                                                format = "%m/%d/%Y",
                                                tz = "GMT"),
                              "%j"))
goose$DOTYLost = as.numeric(format(goose$DateLost1,
                             "%j"))
goose$YLost = as.numeric(format(goose$DateLost1,"%Y")) + (as.numeric(goose$DOTYLost>goose$DOTYMarch1) -1)
goose$DOTYAfterMarch31Lost = as.numeric(goose$DateLost1 - as.POSIXct(paste0("3/1/",goose$YLost),
                                                          format = "%m/%d/%Y", 
                                                          tz = "GMT"))

然后我们可以绘制它。你的代码已经非常完美了。

require(ggplot2)

p <- ggplot(goose, 
            aes(x=DOTYAfterMarch31Lost,
                fill=Nested))+ 
  stat_bin(binwidth=1,
           position="identity")
print(p)

我们得到了这个:

【讨论】:

  • 非常感谢。几乎完美!只需要做一些美学上的改变,我就可以走了。非常感谢您的帮助。
猜你喜欢
  • 2019-01-07
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多