【问题标题】:Plotting over a list of dataframes with 4 variables in each绘制一个数据框列表,每个数据框有 4 个变量
【发布时间】:2019-04-05 13:46:25
【问题描述】:

snippet of data.frame snippet of list of data.frames

我的列表如下所示:

> dput(lapply(list1, head))
list(structure(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), .Dim = c(6L, 
4L), .Dimnames = list(NULL, c("FPAR", "gpp", "LAI", "npp"))), 
    structure(c(63L, 83L, 66L, 84L, 92L, 85L, 9976L, 3318L, 9456L, 
    9435L, 9002L, 9395L, 21L, 32L, 18L, 34L, 50L, 36L, 6742L, 
    5228L, 5405L, 5136L, 5387L, 5339L), .Dim = c(6L, 4L), .Dimnames = list(
        NULL, c("FPAR", "gpp", "LAI", "npp"))), structure(c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA), .Dim = c(6L, 4L), .Dimnames = list(
        NULL, c("FPAR", "gpp", "LAI", "npp"))), structure(c(0L, 
    95L, 0L, 82L, 0L, 82L, 10306L, 10205L, 10306L, 10627L, 10306L, 
    10627L, 0L, 64L, 0L, 31L, 0L, 31L, 6396L, 6340L, 6396L, 6396L, 
    6396L, 6396L), .Dim = c(6L, 4L), .Dimnames = list(NULL, c("FPAR", 
    "gpp", "LAI", "npp"))), structure(c(NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    7331L, NA, NA), .Dim = c(6L, 4L), .Dimnames = list(NULL, 
        c("FPAR", "gpp", "LAI", "npp"))), structure(c(96L, 96L, 
    100L, 88L, 93L, 100L, 12734L, 12215L, 11383L, 11446L, 12672L, 
    11531L, 61L, 61L, 70L, 40L, 58L, 70L, 7807L, 7357L, 7695L, 
    6400L, 6009L, 7735L), .Dim = c(6L, 4L), .Dimnames = list(
        NULL, c("FPAR", "gpp", "LAI", "npp"))), structure(c(95L, 
    95L, 96L, 96L, 96L, 95L, 10829L, 10829L, 9652L, 10321L, 9652L, 
    10829L, 61L, 61L, 62L, 65L, 62L, 61L, 5144L, 5144L, 5188L, 
    5422L, 5188L, 5144L), .Dim = c(6L, 4L), .Dimnames = list(
        NULL, c("FPAR", "gpp", "LAI", "npp"))), structure(c(NA, 
    NA, 87L, 63L, 87L, 87L, NA, NA, 7891L, 7891L, 0L, 7891L, 
    NA, NA, 46L, 19L, 46L, 46L, NA, NA, NA, NA, NA, NA), .Dim = c(6L, 
    4L), .Dimnames = list(NULL, c("FPAR", "gpp", "LAI", "npp"
    ))), structure(c(100L, 100L, 100L, 78L, 100L, 100L, 4011L, 
    4011L, 4112L, 4306L, 3664L, 4112L, 70L, 70L, 70L, 21L, 70L, 
    70L, 2253L, 2425L, 2479L, NA, 2253L, 2253L), .Dim = c(6L, 
    4L), .Dimnames = list(NULL, c("FPAR", "gpp", "LAI", "npp"
    ))), structure(c(83L, 87L, 71L, NA, 0L, 82L, 5627L, 6626L, 
    5862L, NA, 6963L, 5541L, 29L, 37L, 16L, NA, 0L, 28L, 3877L, 
    3695L, 3635L, 1642L, 3692L, 3644L), .Dim = c(6L, 4L), .Dimnames = list(
        NULL, c("FPAR", "gpp", "LAI", "npp"))), structure(c(88L, 
    89L, 61L, NA, 0L, 88L, 6132L, 5636L, 6166L, NA, 6510L, 6502L, 
    49L, 51L, 18L, NA, 0L, 50L, 3413L, 3788L, 3519L, NA, 3463L, 
    3755L), .Dim = c(6L, 4L), .Dimnames = list(NULL, c("FPAR", 
    "gpp", "LAI", "npp"))))

因此,我试图为列表中的 11 个数据帧有效地绘制变量 1 (FPAR) 和变量 2-4 (gpp、LAI、npp) 之间的散点图。我附上了我的列表的外观。

这是我迄今为止想出的,但它不起作用。

library(ggplot2)
scatterplot <- function(yvar){
  ggplot(list1, aes_(x=~age, y=as.name(yvar))) + 
    geom_point() +
    facet_wrap(~dataframe)
}
lapply(list1, scatterplot)

这是我第一次使用列表和 ggplot,所以我有点卡住了..

【问题讨论】:

  • 你能告诉minimal example你的列表是什么样的吗?它们是否共享相同的列名?如果是这样,请使用purrr::bind_cols 及其.id 参数来创建单个数据框。
  • 我添加了一个片段,这是我认为最快的方法。它们具有不同的列名,因为它们代表不同的索引。
  • 最好分享dput(lapply(list1, head)),而不是图片。
  • 好的,谢谢!我添加了它,虽然它很长:)
  • 好多了!您的数据框或矩阵实际上共享相同的列名。您在问题标题中提到的第五个变量在哪里?更重要的是:你想在 x 轴上放什么,在 y 轴上放什么等等?

标签: r list ggplot2 lapply


【解决方案1】:

这并不能回答您的问题,但可能会让您走得更远。您需要考虑函数的输入。如果list1data.frames 的列表,则scatterplot 函数的输入将是data.frame。根据您的 data.frame 结构,您的函数可能如下所示:

df <- data.frame(a = rnorm(n = 20),
                 b = rnorm(n = 20),
                 d = c(rep('first', 10),
                       rep('sec', 10)))
df_l <- list(df, df)

scatterplot <- function(df){
  ggplot(df, aes(x = a, y = b)) + 
           geom_point() +
           facet_wrap(~d)
} 

lapply(df_l, scatterplot)

祝你好运:)

【讨论】:

  • 谢谢!但是我还是不太明白 facet_wrap 是做什么的?我看过一个有几天和几个月的例子,但我希望我的图按 data.frame 分组?
  • facet_wrap 根据列为单个 data.frame 创建子图。 ggplot2 文档非常适合解释和示例ggplot2.tidyverse.org/reference/facet_wrap.html。另请注意,使用 lapply 会产生两个图,每个图都有 2 个子图。
  • 实际上,尝试您的答案,这不适用于我的数据集。我已经融化了我的一个 data.frame,但是 FPAR 最终与我的其他变量在同一列中
  • 检查文档是否有融化。从记忆中我认为你需要melt(df, id.var = "FPAR")
【解决方案2】:

您可以通过以下方式做到这一点。

library(tidyverse)
list1 %>% 
  map(., as_data_frame) %>% 
  bind_rows(., .id = "dataframe") %>%
  gather(., key, value, gpp:npp) %>% 
  mutate(dataframe = factor(dataframe, levels = unique(dataframe))) %>% 
  ggplot(., aes(FPAR, value, col = key)) +
  geom_point() +
  facet_wrap(. ~ dataframe, ncol = 3)

警告: 删除了 71 行包含缺失值 (geom_point)。


您可能想阅读:

【讨论】:

  • 编辑:我打错了,对不起!这有效,虽然我不知道如何。所以正在研究,非常感谢您的帮助!
  • @Gurt。很高兴它奏效了。你不明白哪些部分?我可能会编辑并给出一些解释。
  • . 表示您在函数中使用的数据。所以是的,它确实代表了您在mapbind_rows 中的列表。在您致电bind_rows 之后,我们将处理数据框而不是列表。如果您愿意,可以省略 .。您可以在这里阅读更多相关信息:magrittr.tidyverse.org/#the-argument-placeholder ...
  • ... mutatedplyr 包中的一个函数,用于将列 dataframe 转换为一个因子。如果要指定变量的顺序,这很有用。如果您省略该行,您会看到 ggplot 会像这样对面板进行排序:1 10 11 2 3 4 5 6 7 8 9 从左上角到右下角。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2020-07-13
  • 2020-01-09
  • 2014-01-03
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多