2016-09-30 125 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

我認爲這樣做。其他人的專欄較少。 –