2012-12-15 25 views
2

下面的脚本运行并绘制数据序列的贝叶斯变化点(bcp),其中包含6列数据,这里引用为x < -13:18即数据中的第13至18列文件2GB01.csv。问题是只绘制了第18列的输出图。我需要修改脚本来绘制一个图形窗口分区中每列数据集的6个图。 有什么帮助吗?在R中的循环操作下绘制图形

数据文件看起来是这样.... COL1 COL2 .... col13 col14 col15 col16 col17 col18 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。

的脚本如下书面....

在此处输入代码

data2<-read.csv("2GB01.csv", header=TRUE, row.names=1) 

    x <- 13:18 
    for(i in seq(along=x)){ 
     ond<-data2[,i] 
     bcp.1<-bcp(as.vector(ond)) 
    if (require("strucchange")) { 
    bp <- breakpoints(ond ~ 1, h = 2)$breakpoints 
    rho <- rep(0, length(ond)) 
    rho[bp] <- 1 
    b.num<-1 + c(0,cumsum(rho[1:(length(rho)-1)])) 
    bp.mean <- unlist(lapply(split(ond,b.num),mean)) 
    bp.ri <- rep(0,length(ond)) 


    for (i in 1:length(bp.ri)) bp.ri[i] <- bp.mean[b.num[i]] 
     xax<-seq(1960, 2010, length=51) 
     op <- par(mfrow=c(2,1),col.lab="black",col.main="black") 
     op2 <- par(mar=c(0,4,4,4.5),xaxt="n",yaxt="n", cex.axis=0.75,las=2) 
     plot(xax, ond, col="grey", pch=20, xlab="",ylab="", axes=T) 
     lines(xax, bcp.1$posterior.mean, lwd=2) 
     axis(4, yaxt="s") 
     mtext('Posterior mean', las=0, side=4, line=3.5) 
     lines(bp.ri, col="blue") 
     par(op2) 
     op3 <- par(mar=c(5,4,0,4.5), xaxt="s",yaxt="n", cex.axis=0.75,las=2) 
plot(xax, bcp.1$posterior.prob, xlab="Year", ylab="Posterior probability",  type="l", xlim=c(1960,2010), ylim=c(0,1),las=0) 
    for (i in 1:length(bp.ri)) abline(v=xax[bp[i]], col="blue") 
     axis(2, yaxt="s") 
     par(op3) 
     par(op) 


} else { 
    cat("strucchange is not loaded") 
}} 

回答

2

移动这对你的循环之外:

op <- par(mfrow=c(2,1),col.lab="black",col.main="black") 

如果你每次都叫它,它每次都会设置图的网格(例如清除它)。

您需要执行一些操作,如mfrow=c(2,length(rp.ri))

+0

我已经尝试了您的建议,但仍然无效。我收到错误“plot.new()中的错误:图形边距太大”。我试图减少地块利润率,但我仍然得到同样的错误。我忘了提及脚本运行的脚本必须在R中加载“bcp”和“strucchange”包。 – Vincent

+0

这可能与您在其中存在的所有其他错误有关。从基础开始:'par()'调用,'for'循环,并且在循环的每次迭代中只有一个绘图命令。然后重新构建它以查找您想要的方式。 –

+0

谢谢Ari,你说得对,我只需要将“op < - par(mfrow = c(2,1),col.lab =”black“,col.main =”black“)移到循环外部,但必须用mfcol替代mfrow :)这对我来说很愚蠢,干杯。 – Vincent