我有一个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文件。
答案 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())
})
其中一个情节:
请注意,您需要进行主题更改,特别是如果您希望能够标记个人,但这至少会生成您想要的布局。
答案 1 :(得分:1)
好。我不喜欢你的数据 - 这些都是无聊的直线。让我们生成一些新数据 - 因为它都是数字我会把它留作矩阵而不是转换为数据框:
input = replicate(
n = 3,
matrix(rnorm(n = 240 * 602), nrow = 240, ncol = 602),
simplify = F
)
就像Mark的回答一样,我会把它转换成长格式。由于它是一个矩阵,我们不需要所有数据框编辑工具,我只需as.vector
矩阵并添加index
和id
列。
绘图代码基本上不受马克答案的影响。
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的出色答案 - 唯一的区别是重塑数据的方法和节省的额外位。