R:布局宽度的奇数行为

时间:2013-02-26 06:24:40

标签: r layout plot

我试图让我的底部图形的宽度与月份的长度成比例。

但是,我最终得到了

我有两个级别的图表,一个是较大的图表,占据整行,另一个是12个图表占据整个第二行。

对于第二行图,我希望它们的宽度与月份的长度成比例,所以我这样做

layout(matrix(c(rep(1,12),2:13),nrow=2,byrow=T),widths=c(1,months))

months 
[1] 31 28 31 30 31 30 31 31 30 31 30 31

奇怪的是当我手动调整宽度数组中的数字时(使用1和2)。尺寸确实相应地波动。但是,在这种情况下。情况似乎并非如此。

1月太短了。我错过了我的逻辑吗?

2 个答案:

答案 0 :(得分:3)

底线上只有12个图,但您为widths=参数提供了13个值(数字1加上所有months值)。只需使用widths=months即可获得所需的结果。使用widths =参数提供的值的数量应该等于一个最长行中的绘图数量,但不等于所有绘图的数量。

months<-c( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)    
layout(matrix(c(rep(1,12),2:13),nrow=2,byrow=T),widths=months)
layout.show(n = 13)

enter image description here

答案 1 :(得分:2)

Didzis Elferts的答案是一个很好的答案。我要注意,当你处理时间序列时,你可以使用xts包。特别是该绘图是在基本图形中完成的。 这里有一个例子:

  • 我使用monthly.apply来分割我的对象。
  • 我使用plot.xts来计算我的时间序列。

首先,我生成一些随机数据

library(xts)
days <- seq.Date( as.Date("2011-01-01"), as.Date("2011-12-31") ,1)
dat <- xts(rnorm(365),days)

## I use monthly apply to compute months widths.
## no need to give them by hand.
widths <-  coredata(apply.monthly(dat,length))
par(bg="lightyellow", mar=c(2,2,2,0))
layout(matrix(c(rep(1,12),2:13),nrow=2,byrow=T),widths=widths*2)

mon <- months(days,abbreviate=T)
plot(dat,main = 'my year time series')

apply.monthly(dat,function(x) {
  if(unique(format((index(x)),'%m')) =='01') {#JAN
    par(mar=c(2,2,2,0))   ## special case of JAN because it contians y axis 
    plot(x,main='')
  }
  else{
    par( mar=c(2,0,2,0))
    plot(x,main='',ylab='')
  }
})

enter image description here

请注意:JAN面板不小于2月1。它包含y轴。