2016-09-30 121 views
1

我有一个data.frames列表,我想用ggplot绘制每个data.frame的每一行。我正在寻找将这些存储到一个变量,然后我可以在一个PNG 20x12格式绘制这些。意思是20张图和12张图。使用ggplot在列表中绘制data.frame中的每一行使用ggplot

列表中的每个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]绘制成单独的png文件,绘制20x12的图。

+0

为什么你将'plots'列表包含一个包含列表的列表?然后只能访问最外层? – Gregor

+0

另外你为什么在前一天删除'findpeaks'问题?我正要发表一个答案。使我对这个问题不太感兴趣。 – Gregor

回答

1

好的。我不喜欢你的数据 - 这些都是无聊的直线。让我们产生了一些新的数据 - 而且因为它是所有的数字我会离开它作为一个矩阵,而不是转换成数据帧:

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中试图查看它们。相反,我们将它们保存为很好的压缩文件png并查看这些文件。

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

,因为它超过了最大文件大小,我不能上传的情节 - 甚至然后每个插曲是非常小的。你可能想要更高的高度和宽度。

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

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

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

+0

这是布局!如果我的数据框已经在列表中,我可以循环播放它们,然后在循环中执行df以上的操作,然后执行lapply? –

+0

是的,你应该可以。如果数据框架在结构上有一些根本性差异(例如,缺少列或其他),则会出现唯一的问题。 –

+0

我认为这样做。其他人的专栏较少。 –