R -循环到n列x个矩形中,并在同一个图中绘制每个变量

hts6caw3  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(96)

我一直在看其他类似的文章,但无法弄清楚。我有大量的嵌套,每个嵌套都有大量的列n。重要的是要注意,每个嵌套框架都有相同数量的列,具有相同的名称和相同的顺序。
假设

df1<-data.frame(col1=c(1979:2150),...., coln=c(1:172))
... # many more dataframes with the same format
dfn<-data.frame(col1=c(1979:2150),...., coln(c(1:172)) 

All_dataframes<-list(df1, df2, df3,...,dfn)

我首先尝试为列表中每个数据框的特定列创建一个图表,这似乎可以使用以下简单代码(我无法使用lapply做到这一点,也很乐意接受建议)

my_plot<-ggplot(bind_rows(All_dataframes, .id = "df"), aes(x=Year, y=col17, colour=df))+
         geom_line()

现在我想创建一个循环来遍历列表中包含的每个数组的每个类似列,以将这些变量绘制在同一个图中(与之前的示例相同,但不必指定列,我的数据集太大)。例如,将每个子帧的所有col12绘制在一起,则所有col13、col14.
额外的好处:我还想为每个变量添加一个geom_smooth。我不知道如何添加它。
如果答复中能解释正在做什么,我将不胜感激。我想知道步骤。
谢谢你

0wi1tuuw

0wi1tuuw1#

让我们做一个可重复的例子,用2个y列来绘制,用不同的数据来判断它是否有效:

df1 <- data.frame(col1=c(2001:2020), col2 = runif(20), col3 = runif(20))
df2 <- data.frame(col1=c(2001:2020), col2 = rnorm(20), col3 = rnorm(20)) 

All_dataframes <- list(df1, df2)
one_dataframe = bind_rows(All_dataframes, .id = "df")

然后,我们可以为这些图创建一个列表,并使用for循环来填充列表,在aes()中使用.data[[column_name]]来指定不断变化的美学。(我相信.data语法是在ggplot2 3.0版中引入的。

## create empty list to put plots in
plot_list = list()

## set which columns we want to use as y values
## as a character vector
y_cols = setdiff(names(one_dataframe), c("df", "col1"))

## loop over the columns and assign the plots to the list
for(col in y_cols) {
  plot_list[[col]] = 
    ggplot(one_dataframe, aes(x = col1, y = .data[[col]], col = df)) +
    geom_point() +
    geom_smooth() + 
    labs(title = col)
}

可以通过数字或列名来显示单个图:

plot_list[[1]]

plot_list[["col3"]]

相关问题