运行 使用 out 函数制作图表的 for 循环

running a for loop to make graphs using out function

我正在尝试 运行 一个使用 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 ("patientIDs") 的向量并尝试了这个:

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

但这只会打印出一个 NULL 值 "j"。有关如何执行此操作的任何建议?

无需所有额外编码来为每个患者创建单独的数据框,您可以在创建图时仅按 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)
}