【问题标题】:plot each row in a data.frame in a list using ggplot使用 ggplot 在列表中绘制 data.frame 中的每一行
【发布时间】:2017-02-09 08:48:22
【问题描述】:

我有一个 data.frames 列表,我想使用 ggplot 绘制每个 data.frame 的每一行。我希望将这些存储到一个变量中,以便我可以将它们绘制在 20x12 格式的 png 中。意思是 20 幅图和 12 幅图。

列表中的每个 data.frame 都会获得它自己的 png 文件。

df = data.frame(matrix(rnorm(n=240), nrow = 240, ncol = 602))
df_list = list(df,df,df)
plots=list(list(list()))
for (i in 1:length(df_list)){
  for (k in 1:240){
    testdf = as.numeric(t(df[[i]][k,2:ncol(df[[i]])]))
    testtime = seq_along(df[[i]])
    test =((cbind(testtime,testdf)))
    test = as.data.frame(test)
    plots[[k]]=ggplot(aes(`1`,testdf),data=test)+geom_line()
  }
  plots[i]=rbind(plots[[k]],plots)
}

以下代码为我提供了 [i] 的最后一个循环,但它没有保存前几个循环。有什么想法吗?

如果您知道如何在 20x12 的绘图矩阵中将每个 [i] 绘制成单独的 png 文件,则可以获得奖励积分。

【问题讨论】:

  • 为什么要让plots 包含一个包含一个列表的列表?然后只能访问最外层?
  • 另外,为什么你前几天删除了findpeaks 问题?我正要发布答案。让我对解决这个问题不太感兴趣。

标签: r ggplot2


【解决方案1】:

如果你愿意整理你的数据,可以使用这个,它会自动为每个data.frames生成20x12的布局:

library(tidyverse)

df = data.frame(matrix(rnorm(n=240), nrow = 240, ncol = 602)) %>%
  mutate(id = 1:nrow(.)) %>%
  gather(index, value, -id) %>%
  mutate(index = parse_number(index))

df_list = list(df,df,df)

catch <- lapply(df_list, function(df){
  ggplot(df
         , aes(x = index
               , y = value)) +
    geom_line() +
    facet_wrap(~id
               , nrow = 20
               , ncol = 12) +
    theme(strip.text = element_blank())
})

其中一个情节:

请注意,您需要进行主题更改,特别是如果您希望能够标记个人,但这至少会生成您想要的布局。

【讨论】:

  • 那是布局!!如果我的数据框已经在列表中,我可以遍历它们并在循环中执行您对 df 所做的操作,然后执行 lapply?
  • 是的,你应该可以。如果 data.frames 在结构上有一些根本差异(例如,缺少列或其他东西),就会出现唯一的问题。
  • 我认为可以。一个的列比其他的少。
  • 只要它们的顺序相同,我的代码应该可以工作(它是从列名分配索引)。根据您的结构,例如,如果您的列名与示例不同,您可能需要花更多时间思考如何构建数据。如果你不能得到它,你可能想发布一个单独的问题,询问如何做到这一点。
  • 另一种选择是将它们视为矩阵-如果您跳过输入的data.frame转换(或转换回矩阵mm),而不是mutate %&gt;% gather %&gt;% mutate你可以做到df_long = data.frame(id = 1:nrow(mm), index = rep(1:ncol(mm), each = nrow(mm)), value = as.vector(mm))。两者都可以很好地作为lapply 的一部分在ggplot 之前。
【解决方案2】:

好的。我不喜欢你的数据——都是无聊的直线。让我们生成一些新数据 - 因为它都是数字,所以我将其保留为矩阵而不是转换为数据框:

input = replicate(
    n = 3,
    matrix(rnorm(n = 240 * 602), nrow = 240, ncol = 602),
    simplify = F
)

就像马克的回答一样,我会将其转换为长格式。由于它是一个矩阵,我们不需要所有的数据框编辑工具,我只需as.vector 矩阵并添加indexid 列。

Mark 的回答几乎没有涉及到绘图代码。

plots <- lapply(input, function(mm) { 
    # if you really need to start with data frames, not matrices
    # just put here: mm = as.matrix(mm) 
    df_long = data.frame(id = 1:nrow(mm), index = rep(1:ncol(mm), each = nrow(mm)), value = as.vector(mm))
    ggplot(df_long, aes(x = index, y = value)) +
        geom_line() +
        facet_wrap(~id, nrow = 20) +
        theme(strip.text = element_blank())
})

现在,这些地块很大!每个列表项中有 240 个子图 - 我建议不要在 GUI 中过多地查看它们。相反,让我们将它们保存为压缩良好的pngs 并查看文件。

for (i in seq_along(plots)) {
    ggsave(filename = sprintf("myplot%s.png", i),
           plot = plots[[i]],
           height = 30, width = 18)
}

我无法上传情节,因为它超过了最大文件大小 - 即使这样,每个子情节也非常小。您可能想进一步提高高度和宽度。

这个答案非常接近马克的出色答案 - 唯一的区别是重塑数据的方法和额外的保存位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多