使用purrr map()在ggplot中绘制相同x轴的多个y轴

4

我希望使用purrr包的方法创建多个具有相同x轴但不同y轴的图形。也就是说,我想使用map()或walk()函数来执行此操作。

为了简单起见,使用mtcars数据集。

ggplot(data = mtcars, aes(x = hp, y = mpg)) + geom_point()
ggplot(data = mtcars, aes(x = hp, y = cyl)) + geom_point()
ggplot(data = mtcars, aes(x = hp, y = disp)) + geom_point()

编辑 到目前为止,我已经尝试过:

y <- list("mpg", "cyl", "disp")
mtcars %>% map(y, ggplot(., aes(hp, y)) + geom_point()

2
你做过什么尝试了吗?你卡在哪里了? - aosmith
我曾尝试创建一个我的y变量列表y <- list("mpg", "cyl", "disp"),并将其用作map()函数中的.x参数。对于.f参数,我使用了ggplot(data = ., aes(x = hp, y = y)) + geom_point()。请注意,我是通过从mtcars中管道传入map函数来调用数据的,因此我可以使用.。我从下面的答案中学到(感谢MrFlick),可以使用aes_string()函数来调用您的美学。我也不清楚如何使用匿名函数或公式来产生所需的结果。 - tictacjoe
2个回答

8

这是一个可能性。

ys <- c("mpg","cyl","disp")
ys %>% map(function(y) 
    ggplot(mtcars, aes(hp)) + geom_point(aes_string(y=y)))

这就像任何其他的映射函数一样,您只需要在函数中正确配置您的美学。


感谢您的帮助! - tictacjoe

2
我为此编写了一个更通用的函数,因为它是EDA协议的一部分(Zuur et al.,2010)。这篇来自Ariel Muldoon的文章帮助了我。
plotlist <- function(data, resp, efflist) {
  require(ggplot2)
  require(purrr)
  y <- enquo(resp)

  map(efflist, function(x)
    ggplot(data, aes(!!sym(x), !!y)) +
    geom_point(alpha = 0.25, color = "darkgreen") +
    ylab(NULL)
  )
}

其中:

  • data 是您的数据框
  • resp 是响应变量
  • efflist 是效应(自变量)的字符向量

当然,您可以根据需要更改几何和/或美学。该函数返回一个图表列表,您可以将其传递给例如cowplotgridExtra,如以下示例:

library(gridExtra)
library(dplyr) # just for pipes

plotlist(mtcars, hp, c("mpg","cyl","disp")) %>%
 grid.arrange(grobs = ., left = "HP")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接