使用ggplot绘制列表中data.frame中的每一行

时间:2016-09-30 17:44:36

标签: r ggplot2

我有一个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]的最后一个循环,但它不会保存前几个循环。有什么想法吗?

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

2 个答案:

答案 0 :(得分:2)

如果您愿意整理数据,可以使用它,这将自动为每个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())
})

其中一个情节:

enter image description here

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

答案 1 :(得分:1)

好。我不喜欢你的数据 - 这些都是无聊的直线。让我们生成一些新数据 - 因为它都是数字我会把它留作矩阵而不是转换为数据框:

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

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

绘图代码基本上不受马克答案的影响。

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中过多地查看它们。相反,让我们将它们保存为精确压缩的png并查看文件。

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

我无法上传绘图,因为它超过了最大文件大小 - 即使这样,每个子绘图都非常小。你可能想要更高的高度和宽度。

这个答案非常接近对Mark的出色答案 - 唯一的区别是重塑数据的方法和节省的额外位。