从数据框列表中绘制ggplot的线条

6
我有一个数据框列表:

samplelist = list(a = data.frame(x = c(1:10), y=rnorm(10),
                 b= data.frame(x=c(5:10), y = rnorm(5),
                 c = data.frame(x=c(2:12), y=rnorm(10))

我想构建一个以下格式的ggplot

ggplot()+ 
    geom_line(data=samplelist[[1]], aes(x,y))+
    geom_line(data=samplelist[[2]], aes(x,y))+
    geom_line(data=samplelist[[3]], aes(x,y))

但这并不是完全自动化的。有人有什么建议来解决这个问题吗?

谢谢!


2
你的 samplelist 代码有几个错误。 - eipi10
4个回答

12

ggplot 最有效的使用方式是处理 "长" 格式的数据。在这种情况下,需要将三个数据框堆叠到一个单独的数据框中,并添加额外的一列来标识来源数据框。在这种格式中,您只需要调用一次 geom_line,而标识来源数据框的新列可以用作颜色美学,每个来源数据框都会生成不同的线条。 dplyr 函数 bind_rows 允许您在调用 ggplot 时即时堆叠数据框。

library(dplyr)
library(ggplot2)

samplelist = list(a = data.frame(x=c(1:10), y=rnorm(10)),
                  b = data.frame(x=c(5:10), y=rnorm(6)),
                  c = data.frame(x=c(2:12), y=rnorm(11)))

ggplot(bind_rows(samplelist, .id="df"), aes(x, y, colour=df)) +
  geom_line()

在此输入图片描述

我假设你想要每行都是不同的颜色,并且需要一个图例显示颜色映射。但是,如果出于某种原因,你只想要三条黑线,没有图例,请将colour=df更改为group=df


我收到了一个错误:bind_rows_(x,.id)中的参数1不能是包含数据框的列表。 - Cos

3
这将有效 -
library(ggplot2)
samplelist <- list(a = data.frame(x = c(1:10), y=rnorm(10)),
                  b = data.frame(x=c(5:10), y = rnorm(6)),
                  c = data.frame(x=c(2:12), y=rnorm(11)))

p <- ggplot()
for (i in 1:3) p <- p + geom_line(data=samplelist[[i]], aes(x,y))
p

你在aes()中建议使用i将会失败。 - baptiste
好的,他们都需要在同一个数据框中才能使用。已做出相应修改。 - MeetMrMet

3

或者您可以使用lapply。

library(ggplot2)

samplelist = list(a = data.frame(x = c(1:10), y=rnorm(10)),
                  b= data.frame(x=c(5:10), y = rnorm(6)),
                  c = data.frame(x=c(2:12), y=rnorm(11)))

p <- ggplot()

plot <- function(df){
    p <<- p + geom_line(data=df, aes(x,y))
}

lapply(samplelist, plot)

p

在R中,使用<<-通常不是最佳策略(通常是因为人们更喜欢避免在非本地环境中产生副作用);我认为在这里使用Reduce()更符合惯用法。 - baptiste

1

Reduce是另一种迭代添加元素的选项。

library(ggplot2)

samplelist = list(a = data.frame(x = c(1:10), y=rnorm(10)),
                  b= data.frame(x=c(5:10), y = rnorm(6)),
                  c = data.frame(x=c(2:12), y=rnorm(11)))

pl <- Reduce(f = function(p, d) p + geom_line(data=d, aes(x,y)), 
             x = samplelist, init = ggplot(), accumulate = TRUE)

gridExtra::grid.arrange(grobs = pl)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接