【问题标题】:Plotting a time series event chart in R在 R 中绘制时间序列事件图表
【发布时间】:2015-01-16 15:14:22
【问题描述】:

我在一段时间(5 年)内监控了许多对象(几千个,具有不同的 ID)。每个对象在每个日历日可能会采用几种状态之一:它可以没有事件,它可以采用 10 种不同的事件状态之一,或者它可以退役(即不再有状态更改)。我正在努力可视化这些数据。 我设想类似一组水平线,每条对应一个单独的对象。没有任何事件的日子将用一个灰色(或白色)的小点标记,有事件的日子将用一个彩色圆点表示,颜色匹配事件类型,停用事件用标记和黑点表示之间的每一天退役日期和期限结束。

.....xxxx....xx.......DDDDDDD
.oo.x.qqqq.......xx....qqqqq.
......pppp.pp..######........

等,其中符号将替换为彩色点(线)

如何在 R 中创建这样的图表? 我也对如何更好地可视化此类数据的任何其他想法持开放态度

因此,从 2009 年 1 月 1 日到 2014 年 12 月 31 日期间的数据将如下所示

ObjID|EventStartDate|EventEndDate|EventType|    
00001|2010-01-10    |2010-01-13  | 01      | - event type 1, last for 4 days    
00001|2010-03-30    |2010-04-05  | 03      | - event type 3, last for 6 days    
00001|2012-06-30    |2012-06-30  | 0D      | - decommission    
00011|2009-07-15    |2009-08-10  | 08      |     
00011|2010-11-15    |2010-11-16  | 01      |     
00011|2012-06-30    |2012-07-11  | 05      |     
00011|2013-02-07    |2013-02-09  | 05      |     
01023|2011-11-11    |2011-11-21  | 07      | 

...等

【问题讨论】:

    标签: r plot time-series visualization


    【解决方案1】:

    您可以每天为每个事件绘制一个点,但如果您涵盖那么多时间,您将拥有一个非常大的图表。如果您想这样做,这是一种方法。我将您的示例数据放入名为 dat 的 data.frame 中,日期为 POSIXct 格式。

    # calculate how many days each event lasts
    dat$n_days <- with(dat, 
                   difftime(EventEndDate, EventStartDate, units='days'))+1
    
    # new data frame with 1 row per event day
    row_rep <- unlist(mapply(rep, 1:nrow(dat),  dat$n_days))
    dat2 <- dat[row_rep,]
    
    # add column for discrete event day
    dat2$t_plus <- unlist(mapply(seq, 1,  dat$n_days)) - 1
    dat2$EventDay <- with(dat2, as.Date(EventStartDate) + t_plus)
    
    # plot
    library(ggplot2)
    
    ggplot(dat2, aes(y=factor(ObjID), x=EventDay, color=EventType)) +
      geom_point(shape=21) + 
      labs(title='Events by Date', y='Object ID') +
      theme_bw() + theme(legend.position='bottom')
    

    生成此图表(您可以使用各种相关的 ggplot 参数微调如何根据绘制的形状和颜色来表示事件)

    dat2 看起来像这样:

    > dat2
         ObjID EventStartDate EventEndDate EventType  n_days t_plus   EventDay
    1        1     2010-01-10   2010-01-13        01  4 days      0 2010-01-10
    1.1      1     2010-01-10   2010-01-13        01  4 days      1 2010-01-11
    1.2      1     2010-01-10   2010-01-13        01  4 days      2 2010-01-12
    1.3      1     2010-01-10   2010-01-13        01  4 days      3 2010-01-13
    2        1     2010-03-30   2010-04-05        03  7 days      0 2010-03-30
    2.1      1     2010-03-30   2010-04-05        03  7 days      1 2010-03-31
    2.2      1     2010-03-30   2010-04-05        03  7 days      2 2010-04-01
    2.3      1     2010-03-30   2010-04-05        03  7 days      3 2010-04-02
    2.4      1     2010-03-30   2010-04-05        03  7 days      4 2010-04-03
    2.5      1     2010-03-30   2010-04-05        03  7 days      5 2010-04-04
    2.6      1     2010-03-30   2010-04-05        03  7 days      6 2010-04-05
    3        1     2012-06-30   2012-06-30        0D  1 days      0 2012-06-30
    4       11     2009-07-15   2009-08-10        08 27 days      0 2009-07-15
    4.1     11     2009-07-15   2009-08-10        08 27 days      1 2009-07-16
    4.2     11     2009-07-15   2009-08-10        08 27 days      2 2009-07-17
    4.3     11     2009-07-15   2009-08-10        08 27 days      3 2009-07-18
    4.4     11     2009-07-15   2009-08-10        08 27 days      4 2009-07-19
    4.5     11     2009-07-15   2009-08-10        08 27 days      5 2009-07-20
    4.6     11     2009-07-15   2009-08-10        08 27 days      6 2009-07-21
    4.7     11     2009-07-15   2009-08-10        08 27 days      7 2009-07-22
    4.8     11     2009-07-15   2009-08-10        08 27 days      8 2009-07-23
    4.9     11     2009-07-15   2009-08-10        08 27 days      9 2009-07-24
    4.10    11     2009-07-15   2009-08-10        08 27 days     10 2009-07-25
    4.11    11     2009-07-15   2009-08-10        08 27 days     11 2009-07-26
    4.12    11     2009-07-15   2009-08-10        08 27 days     12 2009-07-27
    4.13    11     2009-07-15   2009-08-10        08 27 days     13 2009-07-28
    4.14    11     2009-07-15   2009-08-10        08 27 days     14 2009-07-29
    4.15    11     2009-07-15   2009-08-10        08 27 days     15 2009-07-30
    4.16    11     2009-07-15   2009-08-10        08 27 days     16 2009-07-31
    4.17    11     2009-07-15   2009-08-10        08 27 days     17 2009-08-01
    4.18    11     2009-07-15   2009-08-10        08 27 days     18 2009-08-02
    4.19    11     2009-07-15   2009-08-10        08 27 days     19 2009-08-03
    4.20    11     2009-07-15   2009-08-10        08 27 days     20 2009-08-04
    4.21    11     2009-07-15   2009-08-10        08 27 days     21 2009-08-05
    4.22    11     2009-07-15   2009-08-10        08 27 days     22 2009-08-06
    4.23    11     2009-07-15   2009-08-10        08 27 days     23 2009-08-07
    4.24    11     2009-07-15   2009-08-10        08 27 days     24 2009-08-08
    4.25    11     2009-07-15   2009-08-10        08 27 days     25 2009-08-09
    4.26    11     2009-07-15   2009-08-10        08 27 days     26 2009-08-10
    5       11     2010-11-15   2010-11-16        01  2 days      0 2010-11-15
    5.1     11     2010-11-15   2010-11-16        01  2 days      1 2010-11-16
    6       11     2012-06-30   2012-07-11        05 12 days      0 2012-06-30
    6.1     11     2012-06-30   2012-07-11        05 12 days      1 2012-07-01
    6.2     11     2012-06-30   2012-07-11        05 12 days      2 2012-07-02
    6.3     11     2012-06-30   2012-07-11        05 12 days      3 2012-07-03
    6.4     11     2012-06-30   2012-07-11        05 12 days      4 2012-07-04
    6.5     11     2012-06-30   2012-07-11        05 12 days      5 2012-07-05
    6.6     11     2012-06-30   2012-07-11        05 12 days      6 2012-07-06
    6.7     11     2012-06-30   2012-07-11        05 12 days      7 2012-07-07
    6.8     11     2012-06-30   2012-07-11        05 12 days      8 2012-07-08
    6.9     11     2012-06-30   2012-07-11        05 12 days      9 2012-07-09
    6.10    11     2012-06-30   2012-07-11        05 12 days     10 2012-07-10
    6.11    11     2012-06-30   2012-07-11        05 12 days     11 2012-07-11
    7       11     2013-02-07   2013-02-09        05  3 days      0 2013-02-07
    7.1     11     2013-02-07   2013-02-09        05  3 days      1 2013-02-08
    7.2     11     2013-02-07   2013-02-09        05  3 days      2 2013-02-09
    8     1023     2011-11-11   2011-11-21        07 11 days      0 2011-11-11
    8.1   1023     2011-11-11   2011-11-21        07 11 days      1 2011-11-12
    8.2   1023     2011-11-11   2011-11-21        07 11 days      2 2011-11-13
    8.3   1023     2011-11-11   2011-11-21        07 11 days      3 2011-11-14
    8.4   1023     2011-11-11   2011-11-21        07 11 days      4 2011-11-15
    8.5   1023     2011-11-11   2011-11-21        07 11 days      5 2011-11-16
    8.6   1023     2011-11-11   2011-11-21        07 11 days      6 2011-11-17
    8.7   1023     2011-11-11   2011-11-21        07 11 days      7 2011-11-18
    8.8   1023     2011-11-11   2011-11-21        07 11 days      8 2011-11-19
    8.9   1023     2011-11-11   2011-11-21        07 11 days      9 2011-11-20
    8.10  1023     2011-11-11   2011-11-21        07 11 days     10 2011-11-21
    

    【讨论】:

    • 阿维,谢谢。我有几个问题,如果你能帮忙的话。如何用特殊符号或颜色标记某些事件类型,比如 3?以及如何标记退役事件并使其成功,让我们说一条黑线到最后。最后,除了 ObjID 之外,有没有办法根据原始表中的某些字段对这个图表进行排序?谢谢
    • scale_shape_manualscale_color_manual 将允许您将形状和颜色映射到事件。您可以将 start date=x 和 end date=(last date in series) 添加到原始数据集中,它应该会显示出来。
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2018-10-22
    • 2017-04-22
    • 2018-05-15
    • 2023-03-21
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多