【问题标题】:R x axis date label only one valueR x 轴日期标签只有一个值
【发布时间】:2011-07-04 22:39:21
【问题描述】:

我正在 R 中创建一个以日期为 x 轴的图。我的框架有日期,没问题。我正在使用自定义日期范围 - 通过使用固定开始来切断一些最早的数据,并通过使用由其他代码确定的结束来稍微超出最新数据。现在的范围是~47天。这一切都很好。

我的问题是 xaxis 标签只包含一个标签“Feb”,但我希望至少包含 3 个标签,如果不是 5 个。

starttime <- strptime("20110110", "%Y%m%d")
endtime <- strptime("20110226 1202", "%Y%m%d %H%M") #This is actually determined programmatically, but that's not important
xrange <- c(starttime, endtime)
yrange <- c(0, 100)
par(mar=par()$mar+c(0,0,0,7),bty="l")
plot(xrange, yrange, type="n", xlab="Submission Time", ylab="Best Score", main="Top Scores for each team over time")
#More code to loop and add a bunch of lines(), but it's not really relevant

生成的图表如下所示:

我真的只是想要更好的标签。我不太关心它们到底是什么,而是月 + 日,至少有 3 个。

【问题讨论】:

  • 好的,看起来axis(1) 或axTicks(1) 可能会自动完成。我只需要弄清楚如何将它从它想要使用的科学记数法更改为“Feb 26”之类的东西......
  • 另外,您可能需要考虑查看matplot(..., type='s'),而不是使用空的plot(),然后单独调用lines()
  • 感谢这个问题,因为它回答了我的问题:使用虚拟绘图调用来设置限制是我发现适用于日期范围/时间数据的唯一方法。

标签: r graph plot


【解决方案1】:

试试这个。我稍微更改了您的 plot() 语句并添加了两行。

 starttime <- strptime("20110110", "%Y%m%d")
 endtime <- strptime("20110226 1202", "%Y%m%d %H%M")
 #This is actually determined programmatically, but that's not important
 xrange <- c(starttime, endtime)
 yrange <- c(0, 100)
 par(mar=par()$mar+c(0,0,0,7),bty="l")

 #I added xaxt="n" to supress the plotting of the x-axis
 plot(xrange, yrange, type="n", xaxt="n", xlab="Submission Time", ylab="Best Score", main="Top Scores for each team over time")

 #I added the following two lines to plot the x-axis with a label every 7 days
 atx <- seq(starttime, endtime, by=7*24*60*60)
 axis(1, at=atx, labels=format(atx, "%b\n%d"), padj=0.5)

 #More code to loop and add a bunch of lines(), but it's not really relevant

【讨论】:

  • 谢谢,太好了。我可以使用 by=(endtime-starttime)/4 之类的东西来生成 5 个均匀分布的点,无论它有多大。当它是 147 天而不是 47 天时,它会更好地扩展。
  • 只需使用len=N 参数来获得N 点---seq() 已经可以做到您在此处的近似值。
【解决方案2】:

此外,请查看axis.Date(),它不是 S3 通用的,但可以帮助设置您想要的额外标签。我为这个函数写了一个补丁,该补丁在几个 R 版本之前被合并,它允许没有标签的轴。这是取自?axis.Date的示例:

random.dates <- as.Date("2001/1/1") + 70*sort(stats::runif(100))
plot(random.dates, 1:100)
# or for a better axis labelling
plot(random.dates, 1:100, xaxt="n")
axis.Date(1, at=seq(as.Date("2001/1/1"), max(random.dates)+6, "weeks"))
axis.Date(1, at=seq(as.Date("2001/1/1"), max(random.dates)+6, "days"),
          labels = FALSE, tcl = -0.2)

产生:

还有Axis.Date(),它 S3 泛型,因此可以通过Axis(dates.vec, ....) 调用,其中dates.vec 是日期的x 轴向量。也可以指定at等。

【讨论】:

    【解决方案3】:

    如果您在调用 plot() 时取消 x 轴注释,然后将 axis() 与手动指定的点和标签一起使用,则可以手动执行此操作:

    axis(1,at=axis.pos[axis.ind],labels=axis.txt[axis.ind])
    

    使用一组索引axis.ind 从 x 值和格式化标签中进行选择。您可以将strftime() 用于任何事情,例如'%d %b' 应该产生白天和人类可读的短月,如

    R> strftime(Sys.Date(), "%d %b")
    [1] "26 Feb"
    

    【讨论】:

    • 这似乎是一条好路,但我不清楚我将使用什么值。我是否只需选择我的开始和结束日期,然后获取中点日期?所以它会是像axis(1, at=starttime, labels=strftime(starttime, "%d %b"))这样的命令?
    • 你需要弄清楚这一点。轴标签是hard。您在次优结果中发现了默认行为,现在您要么需要忍受它,要么自己编写一个小替代方案,或者尝试以不同的方式参数化默认值。也许设置明确的xlim 限制会有所帮助。我们无法确定,因为您没有提供任何(模拟)数据来使其可重现。
    • 我知道这很难——这就是我寻求帮助的原因!如果这很容易,我会想出来的。我提供了生成轴的确切代码,如我的示例中所示。这些行与问题无关。如果你运行我在问题中给出的代码,你会得到没有线条的相同图表,非常适合这个目的。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2014-08-20
    • 2020-07-08
    • 2018-07-10
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多