R x轴日期标签只有一个值

R x轴日期标签只有一个值,r,graph,plot,R,Graph,Plot,我正在R中创建一个以日期为X轴的绘图。我的相框有日期,没问题。我使用的是自定义日期范围,它通过使用固定的开始来切断一些最早的数据,并通过使用由其他代码确定的结束来略微扩展最新的数据。目前的射程约为47天。一切都很好 我的问题是xaxis标签只包含一个标签“Feb”,但我希望至少包含3个标签,如果不是5个的话 starttime <- strptime("20110110", "%Y%m%d") endtime <- strptime("20110226 1202", "%Y%m%d

我正在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

starttime如果在调用
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"

试试这个。我稍微修改了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

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

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)

random.dates这似乎是一条不错的路径,但我不清楚该如何使用这些值。我会选择开始日期和结束日期,然后得到中间日期吗?因此,它将是类似于axis(1,at=starttime,labels=strftime(starttime,“%d%b”))的命令。
?您需要弄清楚这一点。轴标记很难。您在一个次优的结果中发现了默认行为,现在您要么需要接受它,要么自己编写一个小的替代方案,或者尝试以不同的方式参数化默认行为。也许设置显式
xlim
限制会有所帮助。我们无法判断,因为您没有提供(模拟)数据来使此重现。我知道这很难-这就是为什么我寻求帮助!如果容易的话,我早就猜出来了。我提供了生成轴的精确代码,如我的示例中所示。线路与问题无关。如果你运行我在问题中给出的代码,你会得到同样的没有线条的图形,对于这个目的来说非常好。我只需要知道如何将它从它想要使用的科学符号中转换成“2月26日”…也可以考虑查看<代码> Matlab(…,type = s′)< /> >,而不是使用空<代码> PLOTE()/<代码>,然后调用单独的代码>代码>
。感谢您回答我的问题:使用虚拟绘图调用来设置限制是我发现的唯一适用于日期范围/时间数据的方法。谢谢,这很好。我可以使用类似于
by=(endtime starttime)/4的方法来生成5个均匀分布的点,不管它有多大。当它是147天而不是47天时,它的伸缩性会更好。只需使用
len=N
参数来获得
N
点--
seq()
就可以完成这里的近似操作。