多面板图中的扭曲

时间:2015-09-05 07:57:10

标签: r graph

如果我绘制数据并使用线条在图表上叠加相同的数据点,我会得到相同的数据点。让我们说

     x<-rnorm(100)
     plot(x, type="p")
     lines(x, type="p",pch=2)

但是,我已经意识到,在多面板图中进行相同操作时,R图中存在失真。当您再次绘制相同的数据时,似乎R无法回忆y轴上的确切值。下面的简单代码显示了&#34; plot&#34;的输出。和&#34;线&#34;不一样。

  set.seed(1000)
  Range<-rbind(rep(0,4),c(100,100,1,100));thres<-70
  Ylab<-c("MAD","Bias","CP","CIL")

  X<-list(EVI=cbind(runif(10,0,100),runif(10,0,100),
     runif(10,0,1),runif(10,0,100)),
    Qp=cbind(runif(10,0,100),runif(10,0,100),runif(10,0,1),runif(10,0,100)))


   Plot<-function(x,Pch=1,thres)
       {

     par(mfrow=c(1,4),las=2)
        for(j in 1:4)
        {
      plot(x[,j],xaxt = "n",xlab="Estimator",
      ylab=Ylab[j],type = "p", pch = Pch, ylim=Range[,j])
      par(mfg=c(1,j))
       axis(1, at=1:nrow(x), labels=LETTERS[1:nrow(x)]) 


       if(j!=3){
         par(mfg=c(1,j))
         abline(h=thres,col=2)
         }else{
       par(mfg=c(1,j))
       abline(h=c(0.90,0.95,0.99),lty=c(2,1,2),col=rep(2,3))

       }
          }
  }

     Line<-function(x,Pch)
      {
        for(j in 1:ncol(x)) {
         par(mfg=c(1,j))
        lines(x[,j], type = "p", pch = Pch,col=2)
             }
       }


       lapply(X,function(dat)Plot(dat,thres=thres))

       ## First panel
       Line(X$EVI,Pch=2)

       ## Move to second panel
       Line(X$Qp,Pch=2)

第3栏中各点定位失真的原因是什么?请注意,我已将@WhiteViking中每个数据的范围包含在&#34; Plot&#34;功能。但是,失真一直在显现。谢谢

3 个答案:

答案 0 :(得分:0)

问题在于“情节”和“线条”的排序。

像这样的代码,预先使用所有3个'plot'命令:

set.seed(1)
X <- cbind(rnorm(20), 2 * rnorm(20), 3 * rnorm(20))

par(mfrow = c(1,3))

for (i in 1:3) {
  plot(X[,i])
}

for (i in 1:3) {
  par(mfg = c(1,i))
  lines(X[,i], type = "p", col = 2, pch = 3)
}

产生错误选择:

enter image description here

在上面的例子中,执行的第一个'lines'命令将其缩放基于发生的最后一个'plot'。由于它具有比第一个更大的垂直范围,因此“线”的缩放是不正确的。

结构如此:

set.seed(1)
X <- cbind(rnorm(20), 2 * rnorm(20), 3 * rnorm(20))

par(mfrow = c(1,3))

for (i in 1:3) {
  par(mfg = c(1,i))
  plot(X[,i])
  lines(X[,i], type = "p", col = 2, pch = 3)
}

它给出了'plot'和'lines'的正确对齐方式:

enter image description here

您可能需要重新编写代码,将每个子图的“情节”和“线条”组合在一起。

答案 1 :(得分:0)

当第三列转换为百分比时,ylim变得均匀,因此没有这种失真。然而,绕过它而不是这样的特殊转换

会很好

答案 2 :(得分:0)

plot()根据数据范围通过plot.window设置坐标系。此信息显然存储在par(usr) 最新图中,这意味着如果您想重新访问较旧的图,则应存储这些usr值并相应地重置它们,

enter image description here

set.seed(123)
d1 <- data.frame(x=1:10, y=rnorm(10))
d2 <- data.frame(x=1:10, y=10*rnorm(10))

par(mfrow=c(1,2),mar=c(2.5,2.5,0,0))
plot(d1, type="p")
usr1 <- par("usr")
plot(d2, type="p")
usr2 <- par("usr")

par(mfg=c(1,1), usr=usr1)
points(d1, col="red", pch=3)
par(mfg=c(1,2), usr=usr2)
points(d2, col="red", pch=3)