ggplot 数据框列表

GrB*_*rBa 1 r ggplot2 dplyr

示例数据

df_1 <- data.frame(a1 = abs(rnorm(50, 1, 1)),
                   b1 = rnorm(50, 1, 1))  
df_2 <- data.frame(a1 = rnorm(50, 1, 10),
                   b1 = rnorm(50, 1, 1))
df_3 <- data.frame(a1 = rnorm(50, 1, 10),
                   b1 = rnorm(50, 1, 1))

df_all <- list (df_1, df_2, df_3)
Run Code Online (Sandbox Code Playgroud)

我这样使用ggplot,得到了满意的效果

ggplot() +
  geom_line(data = df_all[[1]], aes(x = a1, y = b1), color = "blue", size = 0.05) +
  geom_line(data = df_all[[2]], aes(x = a1, y = b1), color = "blue", size = 0.05) + 
  geom_line(data = df_all[[3]], aes(x = a1, y = b1), color = "blue", size = 0.05)
Run Code Online (Sandbox Code Playgroud)

数据帧的数量每天都在变化,因此需要更好的解决方案。我想到了这个解决方案(当然这是不正确的)

lapply(df_all, ggplot()+ 
         function(x) (geom_line(x, aes(x=a1, y=b1), color='blue'))
       )
Run Code Online (Sandbox Code Playgroud)

我不想将列表转换为一帧

r2e*_*ans 5

幸运的是,ggplot可以添加几何列表:

ggplot() +
  lapply(df_all, function(dat) geom_line(data=dat, aes(a1, b1), color="blue", size=0.05))
Run Code Online (Sandbox Code Playgroud)

为了演示,我将通过更改颜色来稍微不同地执行此操作:

ggplot() +
  Map(df_all, c("blue","darkgreen","red"),
      f = function(dat,col) geom_line(data=dat, aes(a1, b1), color=col))
Run Code Online (Sandbox Code Playgroud)

(稍厚且颜色不同,此处进行演示。)

在此输入图像描述

坦率地说,我认为通常最好将它们组合起来并具有单个框架,使用 ggplot 的本机主题aes映射颜色(即使您避开图例)。

ggplot() +
  Map(df_all, c("blue","darkgreen","red"),
      f = function(dat,col) geom_line(data=dat, aes(a1, b1), color=col))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我冒昧地增加了color=id美学,再次只是为了表明单独的线条在那里。(group=id不过,需要留下来。)

如果您不使用,则bind_rows不需要dplyr,我们也可以使用data.table::rbindlist(.., idcol="id")。Base R 需要做更多的工作才能将 ID 列放入其中,但这远非令人望而却步。

不过,此方法需要的一件事是美学变量具有相同的名称,因此a1b1需要在所有帧中相同。(如果没有,在组合它们时重命名它们可能很容易......)