根据列值在 R 中生成多个图的更简单代码?
Simpler code to generate multiple plots in R based on column values?
我的示例数据框df
如下
df <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 4, 4),
var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
var2 = c(2000, 2001, 2000, 2001, 2000, 2001, 2000, 2001),
var3 = c(1:8))
结果是
ID var1 var2 var3
1 1 a 2000 1
2 1 a 2001 2
3 2 a 2000 3
4 2 a 2001 4
5 3 b 2000 5
6 3 b 2001 6
7 4 b 2000 7
8 4 b 2001 8
我的目标是使用 ggplot2
在折线图中按 var3
绘制 var2
,但我想为每个唯一的 ID
值绘制单独的图。到目前为止,我已经能够通过用唯一的 ID
值子集 df
,然后绘制变量来做到这一点。例如,我有这个代码
df1<- subset(df1, df1$ID == 1)
ggplot(df2, aes(var2, var3)) +
geom_line() +
geom_point()
产生以下情节
这很好用,但使用了很多代码,而且我的真实数据集中有几十个 ID
值,所以我希望能够更快、更高效地完成这项工作。有没有办法使用循环或函数来做到这一点?我还是 R 的新手,我很困惑。谢谢。
最简单的方法是使用 facet_wrap
,但这会将您的所有图表放在一页上,如果您有很多 ID,这将不起作用。相反,您可以创建所有绘图并将它们存储在列表中:
library(ggplot2)
df <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 4, 4),
var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
var2 = c(2000, 2001, 2000, 2001, 2000, 2001, 2000, 2001),
var3 = c(1:8))
plot_list <- lapply(split(df, df$ID), function(x)
{
ggplot(x, aes(var2, var3)) +
geom_line() +
geom_point()
})
现在您可以像这样轻松地绘制它们:
plot_list[[1]]
plot_list[[2]]
plot_list[[3]]
plot_list[[4]]
或者您可以通过简单的循环将它们保存到文件中:
for(i in seq_along(plot_list)) ggsave(paste0("plot_", i, ".png"), plot_list[[i]])
这会将所有四个图保存为名为“plot_1.png”的文件到您的工作目录中的“plot_4.png”。
由 reprex package (v0.3.0)
于 2020-08-12 创建
我的示例数据框df
如下
df <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 4, 4),
var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
var2 = c(2000, 2001, 2000, 2001, 2000, 2001, 2000, 2001),
var3 = c(1:8))
结果是
ID var1 var2 var3
1 1 a 2000 1
2 1 a 2001 2
3 2 a 2000 3
4 2 a 2001 4
5 3 b 2000 5
6 3 b 2001 6
7 4 b 2000 7
8 4 b 2001 8
我的目标是使用 ggplot2
在折线图中按 var3
绘制 var2
,但我想为每个唯一的 ID
值绘制单独的图。到目前为止,我已经能够通过用唯一的 ID
值子集 df
,然后绘制变量来做到这一点。例如,我有这个代码
df1<- subset(df1, df1$ID == 1)
ggplot(df2, aes(var2, var3)) +
geom_line() +
geom_point()
产生以下情节
这很好用,但使用了很多代码,而且我的真实数据集中有几十个 ID
值,所以我希望能够更快、更高效地完成这项工作。有没有办法使用循环或函数来做到这一点?我还是 R 的新手,我很困惑。谢谢。
最简单的方法是使用 facet_wrap
,但这会将您的所有图表放在一页上,如果您有很多 ID,这将不起作用。相反,您可以创建所有绘图并将它们存储在列表中:
library(ggplot2)
df <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 4, 4),
var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
var2 = c(2000, 2001, 2000, 2001, 2000, 2001, 2000, 2001),
var3 = c(1:8))
plot_list <- lapply(split(df, df$ID), function(x)
{
ggplot(x, aes(var2, var3)) +
geom_line() +
geom_point()
})
现在您可以像这样轻松地绘制它们:
plot_list[[1]]
plot_list[[2]]
plot_list[[3]]
plot_list[[4]]
或者您可以通过简单的循环将它们保存到文件中:
for(i in seq_along(plot_list)) ggsave(paste0("plot_", i, ".png"), plot_list[[i]])
这会将所有四个图保存为名为“plot_1.png”的文件到您的工作目录中的“plot_4.png”。
由 reprex package (v0.3.0)
于 2020-08-12 创建