R_使用 for 循环在同一图形上绘制多个图

MaM*_*aMu 2 plot for-loop r

我有 2 个数据框,mydf1 和 mydf2

> mydf1
  id a  b  c
1  1 2 10  2
2  2 3 11  4
3  3 5 12  6
4  4 7 13  8
5  5 8 14 10
> mydf2
  id  a  b  c
1  1  4 20  4
2  2  6 22  8
3  3 10 24 12
4  4 14 26 16
5  5 16 28 20
Run Code Online (Sandbox Code Playgroud)

我想根据 id 绘制变量 a、b 和 c(下面给出示例图)。我也想要变量 b 和 c 的类似图表,并且我想在循环中执行此操作,然后将其导出到本地文件夹。所以,我使用以下代码

for (i in 2:4) {
    jpeg(paste("C:/Data/myplot",i,".jpg"))
         ymin<-min(mydf1[,i],mydf2[,i])
         ymax<-max(mydf1[,i],mydf2[,i])
         plot(mydf1[,1],mydf1[,i],ylim=c(ymin,ymax),xlab="id",ylab=colnames(mydf)[i])
         points(mydf2[,1],mydf2[,i],pch=2)
         legend("topright",c("mydf1","mydf2"),pch=c(1,2))     
         dev.off()
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我想在一张图中获得所有三个不同的图表(id vs a(mydf1和mydf2),id vs b(mydf1和mydf2),id vs c(mydf1和mydf2))。(类似于2)图的第一行和第二行的第三行带有图例)我尝试了以下操作

jpeg("C:/Data/myplot.jpg")
    par(mfrow=c(2,2))
for (i in 2:4) { 
    ymin<-min(mydf1[,i],mydf2[,i])
    ymax<-max(mydf1[,i],mydf2[,i])
    plot(mydf1[,1],mydf1[,i],ylim=c(ymin,ymax),xlab="id",ylab=colnames(mydf)[i])
    points(mydf2[,1],mydf2[,i],pch=2)
    legend("topright",c("mydf1","mydf2"),pch=c(1,2))     
    dev.off()
}
Run Code Online (Sandbox Code Playgroud)

但这没有用。有什么建议可以这样做吗? ps:这是我的任务的简化版本。实际上我有数百列,这就是我使用循环操作的原因

在此输入图像描述id vs a (mydf1 and mydf2)在同一张图上绘制的 示例图

ber*_*roe 5

目前还不清楚你想做什么。您想要 2 个图,一张用于mydf1另一张,mydf2还是全部在一张图上?如果是两个面板,您应该改为当前正在制作 4 个面板的那个mfrow=c(2,1)c(2,2)

如果您希望将它们全部显示在一个图上,请删除该par(mfrow...行。

然后在图中,您将绘制 中的第一个系列mydf1和 中的其他两个系列mydf2。这真的是你想要的吗?

使用基本图形,您应该将plot线条移到循环之外,以便完成一次,将循环更改为从 3 开始,然后将语句保留points在循环内。或者,您可以if在循环内放入一条语句来查看是否是第一次。

您在情节陈述中也有一个拼写错误mydf(没有数字)。

并将你的dev.off()循环移到循环之外,这样它只关闭图形一次。

这是一些生成单面板图的代码,您应该能够修改它以实现您想要的输出......

jpeg("myplot.jpg")
    for (i in 2:4) { 
        ymin<-min(mydf1[,i],mydf2[,i])
        ymax<-max(mydf1[,i],mydf2[,i])
        if (i==2){
            plot(mydf1[,1],mydf1[,i],ylim=c(ymin,ymax),xlab="id",ylab=colnames(mydf1)[i])
            legend("topright",c("mydf1","mydf2"),pch=c(1,2))     
            }
        else{
            points(mydf2[,1],mydf2[,i],pch=2)
        }  
    }
dev.off()
Run Code Online (Sandbox Code Playgroud)

编辑:在你澄清问题之后,我认为唯一的问题是dev.off()应该在循环之外。(对于任何值得呈现的图,我建议使用 PNG 或 PDF,而不是 JPEG...)

png("myplot.png")
par(mfrow=c(2,2))
    for (i in 2:4) { 
        ymin<-min(mydf1[,i],mydf2[,i])
        ymax<-max(mydf1[,i],mydf2[,i])
            plot(mydf1[,1],mydf1[,i],ylim=c(ymin,ymax),xlab="id",ylab=colnames(mydf1)[i])
            legend("topright",c("mydf1","mydf2"),pch=c(1,2))     
            points(mydf2[,1],mydf2[,i],pch=2)
    }
dev.off()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述