2017-04-23 37 views
0

我在R中使用dplyr软件包进行绘制并且难以保存PDF格式的绘图。使用dplyr软件包生成绘图文件时出现故障

我有一个数据框有几组数据,我想绘制每组数据并将绘图保存为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和类似的代码也不能工作。

任何人都可以帮助我吗?

回答

2

您需要拨打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分组Y的单箱线图,你可以使用一个boxplot

boxplot(y ~ x, data = df) 
+1

感谢您的帮助! – Jason

2

这里是你的问题的解决方案:

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])) 
} 
+0

感谢您的帮助! – Jason

2

如果你想要把所有的地块在一个单一的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) 
+0

感谢您的帮助!这非常有启发性! – Jason