R/Zoo:每年在x轴上显示一个蜱虫

R/Zoo:每年在x轴上显示一个蜱虫,r,plot,zoo,R,Plot,Zoo,我有一个动物园的对象,有一个年QTR指数,覆盖大约50年。绘制时,x轴每10年显示一次标签,感觉有点贫瘠: b=zoo(1:200,as.yearqtr(1900+seq(1,200)/4)) plot(b) 一些研究告诉我: plot(b,xaxt="n");axis(1,time(b)) 这感觉就像从一个极端摆动到另一个极端,因为x轴是一个模糊的刻度,带有难看的分数标签。有没有一个简单的方法让它只显示年份?(我最初想说的是:“将x轴标签间距降低一点”,但似乎没有这样的意思?cex.axi

我有一个动物园的对象,有一个年QTR指数,覆盖大约50年。绘制时,x轴每10年显示一次标签,感觉有点贫瘠:

b=zoo(1:200,as.yearqtr(1900+seq(1,200)/4))
plot(b)
一些研究告诉我:

plot(b,xaxt="n");axis(1,time(b))
这感觉就像从一个极端摆动到另一个极端,因为x轴是一个模糊的刻度,带有难看的分数标签。有没有一个简单的方法让它只显示年份?(我最初想说的是:“将x轴标签间距降低一点”,但似乎没有这样的意思?cex.axis只是改变字体大小。)

你读过
帮助(axis)

这里有一种方法,每四个季度创建一个简单的索引:

R> ind <- seq(1, length(b), by=4)

我使用了
las=2
和较低的
cex
值来进行拟合。每年一次可能还是太多了


计算“好的”轴标签真的很难。

当您想使用网格而不是刻度来更好地显示数据时,这可能是(罕见的)情况之一。正如@dirk eddelbuettel指出的,调整好的轴标签是很困难的,尤其是在这样的密度下。您可能还希望标签位于绘图内,因此栅格将略微隐藏其密度。最容易获得的网格是使用
abline
,除非您想使用ggplot2,但它比R(个人意见)中的标准图更难看。同时,让情节更宽。事实上,最好也不要在情节周围设置框;)下面是德克方法的模型:

png("strangeplot.png",width=800)
#extend y-axis to fit inside labels and remove box
plot(b,type="n",xaxt="n",yaxt="n",ylab="",xlab="",ylim=c(min(b)-30,max(b)),bty="n"))
#use 'mpg' to get labels inside
axis(1,time(b)[ind], format(time(b)[ind]), las=2, cex.axis=0.6,tick=F,mgp=c(0,-2.5,0))
axis(2,tick=F,las=1)
#you locate lines slightly to the left of label...
abline(h=seq(0,200,by=50),v=time(b)[ind]-0.5,col=gray(0.9))
#...so you need to add extra single line in the end 
abline(v=max(time(b)[ind])+0.5,col=gray(0.9))
#plot at the end to get it above grid
points(b,type="l")
dev.off() 

谢谢@GeekOnAcid我的第一个问题是为什么不使用grid(),我自己回答了这个问题(它只适用于默认轴标签)。但是,不清楚标签上的数据点是在两行之间,还是在左边或右边的某一行上?@DarrenCook在这个解决方案中,日期点在两行之间,但您可以移动它并在
abline
中定义垂直条,因此它们从标签上方开始。感谢@Dirk我阅读了帮助页面,这相当令人困惑。但我希望有比这个正确答案更简单的答案。这似乎相当低级。(计算好的轴标签很难,但并非不可能,所以我很惊讶R项目中还没有人解决它。)当然已经解决了,请参阅各种plot方法的各种axis()函数的代码。但这并不能消除一个事实,那就是这仍然很难。现在,对于像这样的一次性任务,如我所示使用basic axis()仍然是可能的。
png("strangeplot.png",width=800)
#extend y-axis to fit inside labels and remove box
plot(b,type="n",xaxt="n",yaxt="n",ylab="",xlab="",ylim=c(min(b)-30,max(b)),bty="n"))
#use 'mpg' to get labels inside
axis(1,time(b)[ind], format(time(b)[ind]), las=2, cex.axis=0.6,tick=F,mgp=c(0,-2.5,0))
axis(2,tick=F,las=1)
#you locate lines slightly to the left of label...
abline(h=seq(0,200,by=50),v=time(b)[ind]-0.5,col=gray(0.9))
#...so you need to add extra single line in the end 
abline(v=max(time(b)[ind])+0.5,col=gray(0.9))
#plot at the end to get it above grid
points(b,type="l")
dev.off()