R_Multiple 使用 for 循环绘制同一图形

标签 r for-loop plot

我有 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

我想根据 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()
}

我的问题是我想得到所有三个不同的图表,(id vs a (mydf1 and mydf2) , id vs b(mydf1 and mydf2), id vs c(mydf1 and mydf2) in one figure .(类似于图中第一行的 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()
}

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

enter image description here 示例图 id vs a (mydf1 and mydf2) 绘制在同一张图上

最佳答案

不清楚您要做什么。你想要 2 个图,一个用于 mydf1,一个用于 mydf2,还是全部在一个图中?如果有两个面板,您应该更改为 mfrow=c(2,1) 而不是当前正在制作 4 个面板的 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()

编辑:在您澄清问题之后,我认为唯一的问题是 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()

enter image description here

关于R_Multiple 使用 for 循环绘制同一图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23375338/

相关文章:

r - 绘图选项 'bg' 不工作

r - 轴标签与轴值重叠

r - 使用 tidyverse reshape data.frame 及其列名称

javascript - 使用顺序 for 循环遍历关联数组

r - 如何控制 ggplot 的绘图区域比例而不是将它们拟合到 R 中的设备?

R:如何将 ggbiplot 与 pcaRes 对象一起使用?绘制具有缺失值的数据的 PCA 结果

r - 将 data.tables 的不同子集导出到集群中的每个节点

r - 如何在更改 1 或 2 个变量的同时重复数据框的最后一行 n 次?

java - 避免在 Java 中循环从 Set<Entity> 获取某一特定列的值

r - 如果语句条件错误在两个和问题中缺少值?