我正在尝试运行一个循环,用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。有关如何做到这一点的任何建议吗?
答案 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)
}