i使用r中的dplyr软件包制作图,并以pdf格式保存图。
我有一个带有几组数据的数据框架,我想绘制每组数据并将图保存在PDF中。我尝试在dplyr软件包中使用do和group_by,但是没有生成pdf文件。没有错误消息。
rm(list = ls())
library(dplyr)
df=data.frame(x = c(rep('a',10),rep('b',10)),y = c(1:20))
plt = function(df)
{
pdf('plt1.pdf')
plot(df$x,df$y)
dev.off()
return(data.frame())
}
plt(df)
df %>% group_by(x) %>% do(data.frame(plot(.$y)))
我也尝试了lapply/sapply,并且类似的代码也不起作用。
有人可以帮助我吗?
您需要在do
中调用plt
函数;而且,如果要为每个数据组生成一个单独的PDF文件,则必须基于数据组相应地修改文件名,否则文件被最后一组数据组覆盖了:
plt = function(df) {
pdf(sprintf('plt_%s.pdf', df$x[1]))
plot(df$x,df$y)
dev.off()
return(data.frame())
}
df %>% group_by(x) %>% do(plt(.))
此外,如果您只想将X分组的一个盒子图,则可以使用一个boxplot
:
boxplot(y ~ x, data = df)
这是解决您问题的解决方案:
rm(list = ls())
library(dplyr)
df=data.frame(x = c(rep('a',10),rep('b',10)),y = c(1:20))
plt = function(k, dtset) {
pdf(paste('plt',k,'.pdf',sep=""))
plot(dtset$y)
dev.off()
}
plt(1, df)
grps <- unique(df$x)
for (k in seq_along(grps)) {
plt(k, subset(df, df$x==grps[k]))
}
如果要将所有图都放在一个PDF中并且不介意使用ggplot
,则可以做这样的事情:
library(dplyr)
library(ggplot2)
library(gridExtra)
# i'm using a different test data set to make scatter plots
set.seed(1)
df <- data.frame(id = rep(c("a", "b"), each = 10),
var1 = rnorm(20),
var2 = rnorm(20),
stringsAsFactors = FALSE)
# make a list of plots, one for each group (id)
plotlist <- lapply(unique(df$id), function(x)
df %>%
filter(id == x) %>%
qplot(x = var1, y = var2, data = ., main = x)
)
# use marrangeGrob from gridExtra to get an arranged version of that list
mg = marrangeGrob(plotlist, nrow = 2, ncol = 1)
# now use ggsave to write a pdf with the plots arranged as specified in the
# previous step to the working directory; see documentation for ways to tinker
# with layout, file type, etc.
ggsave("myplots.pdf", mg)