我试图绘制一个条形图并在4年标记处获得刻度标记,其中包含我所获得的日期,但也有较小的标记表示每年每个季度。
barchart(V3~V1, data = differences,origin=0,box.ratio=40, lty=0,reference=TRUE,stack=TRUE,par.settings=list (axis.text=list(cex=1.5), axis.line = list(lwd=3)),scales=list(y=list(tick.number=8, rot=90,alternating=1), x=list(at=c(6,18,30,42,54,66,78,90,102,114,126,138,150,162,174,186,198), labels=c("\n1996","","","","\n2000","","","","\n2004","","","","\n2008","","","","\n2012"),draw=TRUE,tck=1 )))
以下是一些示例数据
01/31/1996 -7.3667
02/29/1996 0.9413
03/31/1996 9.3252
04/30/1996 0.3147
05/31/1996 8.8593
06/30/1996 10.0297
07/31/1996 0.64i3
08/31/1996 2.1397
09/30/1996 0.6759
10/31/1996 -1.5579
11/30/1996 2.9493
.... ....
goes to 2012..
现在这给出了
| | | | | | | |
1996 2000 2004 and so on
所以我希望x轴看起来像
|||||||||||||||||||||||||||||
| | | | | | | |
1996 2000 2004 and so on
where | indicates tick of size 2 and | is size 1 for example
|
如何在不同的时间间隔指定两个不同大小的刻度?感谢。
根据MrFlick的评论更新
是否为我当前的设置使用tel的ifelse语句,如
barchart(V3~V1, data = differences,origin=0,box.ratio=40, lty=0,reference=TRUE,stack=TRUE,par.settings=list (axis.text=list(cex=1.5), axis.line = list(lwd=3)),scales=list(y=list(tick.number=8, rot=90,alternating=1), x=list(at=c(6,18,30,42,54,66,78,90,102,114,126,138,150,162,174,186,198), labels=c("\n1996","","","","\n2000","","","","\n2004","","","","\n2008","","","","\n2012"),draw=TRUE,tck=ifelse(some condition, 1,2 )))
其中某些条件可以参考数字列表6,18,30,42,54,66,78,90,102,114,126,138,150,162,174,186,198。是否有可能以某种方式将其作为数组传递,因此tck可以引用它。即数组[i]%18 == 0,这样的东西,这个tck以某种方式迭代列表
答案 0 :(得分:1)
这是一个显示如何自定义刻度的示例。这是一些示例数据
dd<-data.frame(
V1=seq(as.Date("1996-01-31"), as.Date("2006-12-31"), by="1 mon"),
V2=cumsum(rnorm(132))
)
然后我们可以用
来绘制barchart(V2~V1, dd, horiz=F, xscale.components=function(...) {
dp <- function(x,p) as.numeric(strftime(x, p))
ans <- xscale.components.default(...)
dates <- as.POSIXct(ans$bottom$labels$labels)
xf <- approxfun(as.numeric(dates), ans$bottom$labels$at)
rng <- range(dates)
if(dp(rng[1],"%d")!=1) {
rng[1] <- seq(ISOdate(dp(rng[1],"%Y"), dp(rng[1],"%m"), 1),
length.out=2, by="1 mon")[2]
}
at.dates<-seq(rng[1], rng[2], by="1 mon")
ats <- xf(at.dates)
ans$bottom$ticks$at <- ats
ans$bottom$ticks$tck <- ifelse(((dp(at.dates, "%m")-1) %% 3)==0, 2, 1)
ans$bottom$labels$at <- ats
ans$bottom$labels$labels <- ifelse(dp(at.dates, "%m")==1, dp(at.dates, "%Y"), " ")
ans
}, lty=0, stack=T, origin=0, reference=T,
scales=list(x=list(draw=T, tck=1)))
哪个产生
第一个挑战是barchart()
期望一个分类轴,所以它不太喜欢日期。 (使用xyplot
)会更容易一些。但基本上我们分别用tck
和at
明确设置了刻度长度和位置。如果你改变了刻度线长度,它可能会对标签产生意想不到的后果,除非它们与刻度线的长度相同,所以我只是在空白标签中添加较短的刻度并将它们绘制在相同的位置。您可以查看?xscale.components.default
以获取更多信息。
对于不同的日期范围,这应该相当稳健,但我没有进行过广泛的测试。