【问题标题】:Chronological timeline with points in time and format date带有时间点和格式日期的时间线
【发布时间】:2013-12-20 02:27:47
【问题描述】:

我是 R 和 ggplot2 的新手,我想知道如何使用 R 在给定时间生成时间线绘图点?我的日期也有一些问题。 (我不确定我是否应该将此作为两个问题发布,但这里是)。

我有一个数据框,其中年份和月份为 YYYYMM 格式的字符、两个人的姓名和发生的事件。

像这样:

> data

YearMonth   Person1   Person2    Event
200606       Alice      Bob      event1
200606       Bob        Alice    event2
200608       Alice      Bob      event3
200701       Alice      Bob      event3
200703       Bob        Alice    event2
200605       Alice      Bob      event4

日期最初是整数,我使用as.character() 将其转换为字符。我正在尝试将其转换为格式化的日期。 我使用了as.Date() 并尝试了不同的方式来格式化日期。我最接近的是data$YearMonth <- as.Date(data$YearMonth,"%Y"),但这让我分别获得了所有 2006xx 和 2007xx 行的“2006-12-20”和“2007-12-20”。有什么办法可以让我得到类似“YYYY-MM”或“YYYY/MM”的东西?

我也尝试了data$YearMonth <- strptime(data$YarMonth, "%Y%m"),但这给了我<NA> 值。

但我的主要问题是时间线。

下图是我想要的那种格式:

但 x 轴显示月份和年份(如 2006-06、2006-07 ... 2007-06),并且线从标记有事件、Person1 和 Person2 的轴出来。

我查看了?timeline 的“时间线”包,但我拥有的数据框没有时间段(开始日期和结束日期)的数据。我只有一个时间点(年月)。

我还使用 ggplot2 尝试了Draw a chronological timeline with ggplot2 的示例。但是我没有 y 轴的位错,我希望事件线脱离 x 轴。

注意:这是一个非常简化的示例,因为我在 2006 年 6 月至 2007 年 6 月期间有大约一千行。是否有可能用这么多数据制作时间线?

非常感谢任何帮助。感谢您的宝贵时间!

【问题讨论】:

    标签: r plot timeline date-formatting


    【解决方案1】:

    这是另一个尝试:

    df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
    rangeYM <- range(df$YM)
    
    plot(NA,ylim=c(-1,1),xlim=rangeYM,ann=FALSE,axes=FALSE)
    abline(h=0,lwd=2,col="#5B7FA3")
    
    ypts <- rep_len(c(-1,1), length.out=nrow(df))
    txtpts <- rep_len(c(1,3), length.out=nrow(df))
    segments(df$YM,0,df$YM,ypts,col="gray80")
    
    axis.Date(
     1,
     at=seq.Date(rangeYM[1],rangeYM[2],by="month"),
     format="%Y-%m",
     cex.axis=0.6,
     pos=0,
     lwd=0,
     lwd.tick=2,
     col="#5B7FA3",
     font=2
    )
    
    points(df$YM,y=ypts, pch="-", cex=1.5, col="#5B7FA3")
    par(xpd=NA)
    text(
      df$YM, y=ypts,
      labels=paste(df$Person1,df$Person2,df$Event,sep="\n"), cex=0.7, pos=txtpts
    )
    par(xpd=FALSE)
    

    【讨论】:

    • 非常感谢@thelatemail。除了我拥有的数据量存在一些问题外,它运行良好! :)
    • @thelatemail in axis.Date pos 将日期值定位在水平线上。在ggplot2中有什么选择吗?在scale_x_date 中没有位置选项。请帮忙
    • 您知道如何在每天 2 次以上的活动中做到这一点吗?我在这里根据您的示例发布了一个问题:stackoverflow.com/questions/43529103/…
    • plot.window(...) 中的错误:需要有限的“xlim”值调用:任意 eval -> plot -> plot.default -> localWindow -> plot.window
    • @europa - 您的 x 轴值中可能有 NA。尝试范围(df$YM,na.rm=TRUE)。
    【解决方案2】:

    为什么不这样:

    
    >YearMonth = c(200506,200509) 
    
    >dt = as.POSIXct(strptime(paste0(YearMonth, 15), "%Y%m%d"))
    >z = rep(0, length(dt))
    >y = rep(c(-1,1), out=length(dt))
    >plot(dt,y, axes=FALSE, ylab="", xlim=c(min(dt)-10e6, max(dt)+10e6), ylim=c(-2,2), pch=15, col="darkblue", xlab="Date")
    >arrows(x0=dt,y0= z, x1=dt, y1=y, length=0, angle=30, col="blue")
    >arrows(min(dt), 0, max(dt), length=0, col="blue")
    >text(dt, y*1.5, c("Ben Franklin arose\nfrom the dead", "Atlantis found"), adj=1)
    >axis.POSIXct(1, dt, format="%y/%m")
    >dt
    [1] "2005-06-15 EDT" "2005-09-15 EDT"
    

    【讨论】:

    • 感谢您的回复。这也给了我一天,而不仅仅是年份和月份。我想我可以使用它,但我想知道它是否会在制作时间线时引起问题。我想看看是否可以将数据框中的日期用作轴的日期。
    • @o.o - alex 所做的只是为每个月/年选择一个中间点。任何月/年组合的图都会有一个与之相关的名义日期,无论是第一天、最后一天、中间还是其他天。
    • 我更改了轴上的日期——它们看起来确实包含了一天。 “天”添加只是使 POSIXct 日期函数工作的一个技巧,它使绘图更容易。您应该能够将我的日期函数直接应用于数据框以使您的日期有效。
    • 您的另一个选择是将您的日期转换为十进制日期 - 如果您不担心情节上的月份,这会更好。
    • 谢谢大家的帮助:)
    【解决方案3】:

    通过对@thelatemail 的回答进行一些细微的更改,您可以微调轴以打印事件日期的指标,还可以管理同一日期发生的事件的重叠..或管理由于您拥有的数据量而产生的重叠在你的 df..

    df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
    rangeYM <- range(df$YM)
    plot(NA,ylim=c(-1,1),xlim=rangeYM,ann=FALSE,axes=FALSE)
    abline(h=0,lwd=2,col="#5B7FA3")
    ypts <- rep(c(-1,-0.5,0.5,1), length.out=nrow(df))
    txtpts <- rep(c(1,3), length.out=nrow(df))
    segments(df$YM,0,df$YM,ypts,col="gray80")
    axis.Date( 1,at=seq.Date(rangeYM[1],rangeYM[2],by="days"),
    format="%Y-%m",
    cex.axis=0.6, pos=0, lwd=0, lwd.tick=2, col="#5B7FA3", font=2)
    points(df$YM,y=ypts, pch="-", cex=1.5, col="#5B7FA3")
    par(xpd=NA)
    text( df$YM, y=ypts,labels=paste(df$Person1,df$Person2,df$Event,sep="\n"),cex=0.7, pos=txtpts)
    par(xpd=FALSE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2011-09-25
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多