facet_wrap用于循环中的直方图:"至少一个层必须包含所有变量"

时间:2016-09-21 10:48:06

标签: r loops ggplot2 facet-wrap

我正在研究在循环中生成刻面直方图。当我在循环中调用facet_wrap时会出现问题。我尝试了不同的选项,但所有选项都失败了,并显示以下消息:

  

layout_base中的错误(data,vars,drop = drop):至少一个图层必须包含用于构面的所有变量

以下是可重现的例子。

library(ggplot2)
library(scales) #date_format

## Reproducible example

datatest <- data.frame(
  column1 = sample(c("yes", "no"), 50, replace = TRUE),
  column2 = sample(c("yes", "no"), 50, replace = TRUE),
  column3 = sample(c("yes", "no"), 50, replace = TRUE),
  column4 = sample(c("yes", "no"), 50, replace = TRUE)
)

#This function will generate a uniform sample of dates from 
#within a designated start and end date:    
rand.date=function(start.day,end.day,data){   
  size=dim(data)[1]    
  days=seq.Date(as.Date(start.day),as.Date(end.day),by="day")  
  pick.day=runif(size,1,length(days))  
  date=days[pick.day]  
}

#This will create a new column within your data frame called date:
datatest$date=rand.date("2016-01-01","2016-09-21",datatest)

## Simple frequency plot that works well
histotest <- ggplot(datatest, aes(x = date)) + 
  geom_histogram(binwidth = 7, fill="#2a87c8", colour="white") +
  scale_x_date(limits = c(Sys.Date() - 250, NA), labels = date_format("%b %Y")) +
  labs(x = "Period", y = "Count") +
  facet_wrap(~ column1 , ncol=1) +
  theme(plot.title=element_text(face="bold", size=9),
        panel.grid.major = element_line(colour = "white"),
        panel.grid.minor = element_blank())
ggsave("out/column1_histo.png", plot=histotest, width=12, height=6,units="in", dpi=300)

问题出现了:

## Same plot generated through a loop
## The pb is with the facet_wrap 
for (i in 1:4 ) {  
  rm(variablename)
  variablename <- names(datatest)[i]
  ## histogramme to display event occurence over time
  histoloop <- ggplot(datatest, aes(x = date)) + 
    geom_histogram(binwidth = 7, fill="#2a87c8", colour="white") +
    scale_x_date(limits = c(Sys.Date() - 250, NA), labels = date_format("%b %Y")) +
    labs(x = "Period", y = "Count") +

    ## I tried different options but none of them is working 
    ## If I comment the facet_wrap everything's fine...
    facet_wrap(~ variablename , ncol=1) +
    #facet_wrap(~ names(datatest)[i] , ncol=1) +
    #facet_wrap(~ aes_string(names(datatest)[i]) , ncol=1) +
    theme(plot.title=element_text(face="bold", size=9),
          panel.grid.major = element_line(colour = "white"),
          panel.grid.minor = element_blank())
  ggsave(filename=paste("out/",variablename,"_histo.png",sep=""), plot=histoloop, width=12, height=6,units="in", dpi=300)
}  

2 个答案:

答案 0 :(得分:1)

更改代码如下(因为variablename是一个字符串):

promisifyAll

答案 1 :(得分:0)

重新格式化绘图数据,然后在循环中绘制分割数据:

library(tidyr) #gather

# prepare the data, wide to long
plotDat <- gather(datatest, key = "Column", value = "Value", -c(date) )

# then use loop, I prefer lapply
lapply(split(plotDat, plotDat$Column), function(i){
  ggplot(i, aes(x = date)) + 
    geom_histogram(binwidth = 7, fill="#2a87c8", colour="white") +
    scale_x_date(limits = c(Sys.Date() - 250, NA), labels = date_format("%b %Y")) +
    labs(x = "Period", y = "Count") +
    facet_wrap(~ Value , ncol = 1) +
    theme(plot.title=element_text(face="bold", size=9),
          panel.grid.major = element_line(colour = "white"),
          panel.grid.minor = element_blank())
})