运行 使用 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)
}
我正在尝试 运行 一个使用 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)
}