我需要在1-3个图表之间显示,我希望图表的标题基于使用的变量名称。
我可以在下面找到我想要的工作:
library(grid)
library(ggplot2)
library(gridExtra)
a1 <- sample(1:100)
a2 <- sample(1:100)
a3 <- sample(1:100)
make_graph <- function(x, y=deparse(substitute(x))){
time <- 1:100
dfp <- data.frame(time, x)
ggplot(dfp, aes(x=time, y=x)) + geom_point() +
ggtitle(y)
}
g1 <- make_graph(a1)
g2 <- make_graph(a2)
g3 <- make_graph(a3)
grid.arrange(g1,g2,g3)
但如果只需要1个或2个样本(即只有a1或a1和a2),则需要包含条件语句时效率会降低。
除了正确的标题外,我已经完成了以下工作:
library(grid)
library(ggplot2)
library(gridExtra)
a1 <- sample(1:100)
a2 <- sample(1:100)
a3 <- sample(1:100)
sample_list <- paste0("a", seq_len(3))
make_graph <- function(x, y=deparse(substitute(x))){
time <- 1:100
dfp <- data.frame(time, x)
ggplot(dfp, aes(x=time, y=x)) + geom_point() +
ggtitle(y)
}
graphs_list <- lapply(mget(sample_list), make_graph)
do.call("grid.arrange", graphs_list)
使用上面的代码我得到了正确的功能,但make_graph()中的deparse()似乎有一些问题,我假设是由于使用lapply调用。因此,而不是我在初始示例中的标题(“a1”,“a2”,“a3”),而是获得“X [[1L]]”,“X [[2L]]”,“X [[ 3L]]”。
我也试过改变lapply函数,但这只给了我列表中的第一个“标题”:
sample_list <- paste0("a", seq_len(3))
make_graph <- function(x, y){
time <- 1:100
dfp <- data.frame(time, x)
ggplot(dfp, aes(x=time, y=x)) + geom_point() +
ggtitle(y)
}
graphs_list <- lapply(mget(sample_list), make_graph, y=sample_list)
do.call("grid.arrange", graphs_list)
我不确定完成我在这里要做的事情的最佳方法。 谢谢你的帮助。
答案 0 :(得分:2)
您对来自lapply
的变量名称是正确的。因此deparse
策略在这种情况下不是一个好的策略。但是,由于您可以非常轻松地传递标题,因此您可以使用Map
而不是lapply
。
graphs_list <- Map(make_graph, mget(sample_list), sample_list)
do.call("grid.arrange", graphs_list)
这给出了期望的结果。