R - ggplot geom_ribbon进入应用函数多个绘图

时间:2017-11-12 02:51:47

标签: r ggplot2 apply

我的代码有问题。 我必须在pdf的许多页面中打印许多图表,我已使用apply函数和grid.Extra包解决了这个问题。 我的最后一个问题(目前)是我不明白如何在geom_ribbon函数中插入apply,因为列不同。 我尝试过不同的方式。从索引开始,然后使用yminymax命令重建pastegsub。但这对于解决这个问题并不是一个好主意。 在这里我的代码:

plotserieslines <- function(yvar){
  ggplot(d, aes_string(x=d$YEAR, y=yvar,  col = interaction(d$Manage, d$Meteo, sep="|"))) + geom_line( alpha=0.8)+
    geom_ribbon(aes_string(x= d$YEAR, ymin=yvar,ymax=yvar,fill = interaction(d$Manage, d$Meteo, sep="|")), alpha=0.1)+
       theme(legend.key=element_blank(),
          legend.background = element_blank(),
          legend.position = c(0.05, 0.95),
          axis.text=element_text(size=7),
          axis.title=element_text(size=7),
          legend.spacing.y = unit(-2.2, "cm"),
          legend.text=element_text(size=10),
          legend.title=element_blank(),
          legend.key.size = unit(0.7, 'lines')) +
    guides(col = guide_legend(ncol = 1),
           fill=guide_legend( keywidth=0.4,
                              keyheight=0.2,
                              default.unit="cm")) +
    xlab("YEAR") +
    ylab(yvar)
  }
plots <- lapply(names(d[cod]), plotserieslines)

plots1 <-  marrangeGrob(grobs = plots, nrow = 8, ncol = 5)

非常感谢您提前!!

2 个答案:

答案 0 :(得分:1)

我认为purrr::map2()可以胜任。

plotserieslines2 <- function(yvar1, yvar2){
    ggplot(d) +
      geom_line(aes_string(x = "YEAR", y = yvar1, ...), ...) +
      geom_ribbon(aes_string(x = "YEAR", ymax = yvar1, ymin = yvar2, ...), ...) +
      ...
}

cols_ymax <- c("a_max", "b_max", "c_max")
cols_ymin <- c("a_min", "b_min", "c_min")
plots <- map2(cols_ymax, cols_ymin, plotserieslines2)

但是,您应该考虑通过将列折叠为每ymaxymin一列来将原始数据转换为"tidy data"形式。然后,您可以使用lapply()代替map()facet_wrap(),而不是library(tidyr) library(dplyr, warn.conflicts = FALSE) d <- data.frame( id = 1:3, a_max = 1:3 * 10, b_max = 1:3 * 11, c_max = 1:3 * 12, a_min = 1:3 * 3, b_min = 1:3 * 4, c_min = 1:3 * 5 ) d #> id a_max b_max c_max a_min b_min c_min #> 1 1 10 11 12 3 4 5 #> 2 2 20 22 24 6 8 10 #> 3 3 30 33 36 9 12 15 d_tidy <- d %>% gather("type", "value", -id) %>% separate(type, into = c("category", "min_or_max"), sep = "_") %>% spread(min_or_max, value) d_tidy #> id category max min #> 1 1 a 10 3 #> 2 1 b 11 4 #> 3 1 c 12 5 #> 4 2 a 20 6 #> 5 2 b 22 8 #> 6 2 c 24 10 #> 7 3 a 30 9 #> 8 3 b 33 12 #> 9 3 c 36 15 library(ggplot2) ggplot(d_tidy) + geom_ribbon(aes(id, ymin = min, ymax = max)) + facet_wrap(~ category)


{% for a in test%}

{{a.H}} {{a.2B}}<br> 

{% endfor %}

答案 1 :(得分:0)

感谢您的回答! 我已使用mapply使用选项SIMPLIFY=FALSE而不是lapply解决了此问题,并且我可以轻松地为我的函数使用多个参数。使用此功能,我获得了lapply的相同列表。

上面的解决方案非常适合facet,但是我有数百个图表需要在许多pdf页面中打印,而且我不知道facet_grid是否是正确的解决方案多页印刷。 无论如何,谢谢你。

如果还有其他有用的方法可以更智能地解决这个问题,请写下这篇文章!我发现它的信息很差,许多解决方案都不能正常工作。

一切顺利!