运行for循环以使用out函数生成图形

时间:2016-10-11 16:08:34

标签: r loops graph ggplot2 out

我正在尝试运行一个循环,用ggplot2打印出散点图。这是场景:

我有一个405,000行的数据框。每行指的是散点图上的点(x值,y值),并且还与特定患者相关联。每位患者有很多行。

为了分离每位患者的数据,我使用以下内容:

out <- split(df, f = df$patientID)

然后,我可以为每位患者创建一个数据框,如下所示:

df_patientID <- out[[“patientID”]]

然后,我可以为每个患者数据框制作一个散点图:

pl <- ggplot(df_patientID, aes(x = df_patientID$xval, y = df_patientID$yval))
pl+geom_point(color=“red)

这对我有用,但由于有472名患者,我想做一个循环,这样我就能得到每个病人的散点图。我创建了一个包含所有患者ID的载体(&#34; patientIDs&#34;)并尝试了这个:

`For (i in patientIDs){
j <- out[[“i”]]
pl <- ggplot(j, aes(x = df_i$xval, y=df_i$yval))
pl + geom_point(color=“red”)

但是只打印出一个值&#34; j&#34;那是NULL。有关如何做到这一点的任何建议吗?

1 个答案:

答案 0 :(得分:1)

除了为每位患者创建单独数据帧的所有额外编码外,您还可以在创建绘图时按patientID对数据框进行子集,或者将数据框分割为patientID。此外,您不应在aes内重复数据框名称。您将数据框提供为ggplot的第一个参数。在aes内,您应该只使用列名。

您可能会发现创建包含所有图表的列表而不是循环,然后您可以打印,保存等等。

library(ggplot2)

plot.list = lapply(split(df, df$patientID), function(dat) {
  ggplot(dat, aes(x = xval, y = yval)) + 
    geom_point(color="red") +
    facet_wrap(~ patientID)
})

plot.list的每个元素都是一个patientID的图,每个列表元素的名称是该图的patientID的值。例如,在运行上面的代码后,如果要查看patientID 548的图,请键入plot.list[["548"]]。您还可以将图表保存到文件中,在页面上布置多个图表等。

要在循环中打印每个绘图,您可以这样做:

for (i in unique(df$patientID)) {
  pl = ggplot(df[df$patientID==i, ], aes(x = xval, y = yval)) + 
    geom_point(color="red") +
    facet_wrap(~ patientID)
  print(pl)
}

或者您可以创建一个图表列表,以便以后打印,保存等等:

pl = list()
for (i in unique(df$patientID)) {
  pl[[i]] = ggplot(df[df$patientID==i, ], aes(x = xval, y = yval)) + 
    geom_point(color="red") +
    facet_wrap(~ patientID)
}