R_Multiple使用for循环在同一图上绘制

时间:2014-04-29 21:10:04

标签: r 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

我想绘制变量a,b& c对id(样本图如下)。 我想要变量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和mydf2),id vs b(mydf1和mydf2),id vs c(mydf1和mydf2)在一个图中。(图中第一行的第2行和图例第二行的第3行)我尝试了以下内容

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 个答案:

答案 0 :(得分:3)

目前还不清楚你要做什么。你想要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

答案 1 :(得分:2)

我做的事情

mydf1$g <- 1
mydf2$g <- 2
d3 <- rbind(mydf1, mydf2)
library(reshape2)
d3 <- melt(d3, id.vars = c('id', 'g'))
library(ggplot2)
ggplot(d3, aes(x=id, y=value)) + 
  geom_point(aes(colour = as.factor(g), shape = variable))

ggplot example

或使用facets

ggplot(d3, aes(x=id, y=value)) + 
  geom_point(aes(colour = as.factor(g))) +
  facet_wrap(~variable)

ggplot with faceting

最终将其导出

ggsave(file = paste0(tempdir(), 'myplot.png'),
last_plot()
)