【问题标题】:Plot lines in ggplot from a list of dataframes从数据框列表中的 ggplot 中绘制线条
【发布时间】:2017-07-02 22:55:33
【问题描述】:

我有一个 data.frames 列表:

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))

但这并不是超级自动化的。有人对如何解决这个问题有建议吗?

谢谢!

【问题讨论】:

  • 仅供参考,您的samplelist 代码有一些错误。

标签: r list plot ggplot2


【解决方案1】:

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 不能是包含数据帧的列表
【解决方案2】:

或者你可以使用 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

【讨论】:

  • 使用 &lt;&lt;- 通常不是 R 中的最佳策略(通常是因为人们更喜欢避免在非本地环境中的副作用);我认为Reduce() 在这里更惯用。
【解决方案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 的建议将失败
  • 好点,他们都需要在同一个df中才能使用它。相应地编辑
【解决方案4】:

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)

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多