我的代码有问题。
我必须在pdf的许多页面中打印许多图表,我已使用apply
函数和grid.Extra
包解决了这个问题。
我的最后一个问题(目前)是我不明白如何在geom_ribbon
函数中插入apply
,因为列不同。
我尝试过不同的方式。从索引开始,然后使用ymin
和ymax
命令重建paste
和gsub
。但这对于解决这个问题并不是一个好主意。
在这里我的代码:
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)
非常感谢您提前!!
答案 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)
但是,您应该考虑通过将列折叠为每ymax
和ymin
一列来将原始数据转换为"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
是否是正确的解决方案多页印刷。
无论如何,谢谢你。
如果还有其他有用的方法可以更智能地解决这个问题,请写下这篇文章!我发现它的信息很差,许多解决方案都不能正常工作。
一切顺利!