我的问题是关于使用for循环重复基于类别变量的数据分析。使用内置的Iris数据集,我如何在下面的代码上运行一个for循环,这样它就可以首先生成setosa,然后是versicolor,然后是virginica的图表,而不必手动更改/设置物种?
Iris
ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point()
我刚开始还不知道我在做什么
kninwzqo1#
您需要按照here所述使用print()
print()
library(tidyverse) data(iris) species <- iris |> distinct(Species) |> unlist() for(i in species) { p <- iris |> filter(Species == i) |> ggplot() + geom_point(aes(x=Sepal.Length, y=Sepal.Width)) + ggtitle(i) print(p) }
km0tfn4u2#
你可以使用一个for循环作为u/DanY posted;然而,使用这种结构很难以通用的方式存储和检索绘图。运行循环代码使得检索任何一个特定的绘图变得很困难-您只能在输出窗口中看到最后一个绘图,并且必须“返回”才能看到其他绘图。我建议使用列表结构,以允许您在后续函数中检索任何一个单独的绘图。为此,您可以使用lapply()而不是for(...) { ... }。下面是一个使用dplyr和tidyr的示例:
lapply()
for(...) { ... }
dplyr
tidyr
library(ggplot2) library(dplyr) library(tidyr) unique_species <- unique(iris$Species) myPlots <- lapply(unique_species, function(x) { ggplot( data = iris %>% dplyr::filter(Species == x), mapping = aes(x=Sepal.Length, y=Sepal.Width) ) + geom_point() + labs(title=paste("Plot of ", x)) })
然后将绘图存储在myPlots中。您可以通过myPlots[1]、myPlots[2]或myPlots[3]访问每个绘图...或者您可以通过patchwork或其他类似的软件包将它们一起绘图。
myPlots
myPlots[1]
myPlots[2]
myPlots[3]
patchwork
cowplot::plot_grid(plotlist = myPlots, nrow=1)
2条答案
按热度按时间kninwzqo1#
您需要按照here所述使用
print()
km0tfn4u2#
你可以使用一个for循环作为u/DanY posted;然而,使用这种结构很难以通用的方式存储和检索绘图。运行循环代码使得检索任何一个特定的绘图变得很困难-您只能在输出窗口中看到最后一个绘图,并且必须“返回”才能看到其他绘图。我建议使用列表结构,以允许您在后续函数中检索任何一个单独的绘图。为此,您可以使用
lapply()
而不是for(...) { ... }
。下面是一个使用
dplyr
和tidyr
的示例:然后将绘图存储在
myPlots
中。您可以通过myPlots[1]
、myPlots[2]
或myPlots[3]
访问每个绘图...或者您可以通过patchwork
或其他类似的软件包将它们一起绘图。