使用purrr map打印ggplot图表

4
我希望能够为我的响应变量创建ggplots,与我的数字列相关。以下是可重现的代码:
test = mpg %>% select_if(is.numeric) %>% 
dplyr::select(-year) %>% nest(-cyl) %>% 
mutate(ggplots = map(data,~ggplot(data = .x) + geom_point(aes(x = cyl, y = .x))))

test
# A tibble: 4 x 3
    cyl           data ggplots
  <int> <list<df[,3]>> <list> 
1     4       [81 x 3] <gg>   
2     6       [79 x 3] <gg>   
3     8       [70 x 3] <gg>   
4     5        [4 x 3] <gg>   
Warning message:
All elements of `...` must be named.
Did you want `data = c(displ, cty, hwy)`? 

错误信息:

test$ggplots[[1]]
Don't know how to automatically pick scale for object of type tbl_df/tbl/data.frame. Defaulting to continuous.
Error: Aesthetics must be either length 1 or the same as the data (81): x, y

什么问题?

1
你有 data=.xaes(y=.x)。其中一个 .x 需要是 data.frame/tibble,另一个需要是列名。你想要绘制什么? - MrFlick
尝试将 cyl 与所有其他 numeric cols 绘制在一起。 - Shery
只是想澄清一下,您不需要任何按组绘制的图表,而是要将“cyl”与其他变量绘制在一起? - aosmith
1个回答

10

当我们想要循环遍历一堆变量并将它们中的每一个与另一个变量绘制在一起时,其中一种选择是循环遍历变量名。

我首先会在y上提取我想要的变量名称。在管道的末尾使用set_names()为向量命名其自身,因为有时我稍后需要对其进行组织。

vars = mpg %>%
     select_if(is.numeric) %>%
     select(-cyl, - year) %>%
     names() %>%
     set_names()

结果是一个字符串的向量。

vars
# displ     cty     hwy 
# "displ"   "cty"   "hwy" 

现在我可以循环遍历这些变量名,并针对固定的x变量cyl制作绘图。 我将使用purrr::map()循环执行此操作。 由于我正在使用字符串,因此需要在ggplot()内使用整洁评估,使用.data代词实现(我认为这只适用于rlang的最新0.4.0版本发布)。 我使用labs()中的变量标签y轴,否则它将在轴标签中包含.data代词。

plots = map(vars, ~ggplot(data = mpg) +
                 geom_point(aes(x = cyl, y = .data[[.x]]) ) +
                 labs(y = .x)
)

如果您对更多解释感兴趣,我在去年写的一篇博客文章中展示了上述方法的应用,链接在这里

如果您不想像这样循环遍历字符串,另一种选择是将数据集重塑为长格式,然后使用嵌套方法。方法是制作一个长数据集,将您想要放在y轴上的变量取出,并将它们的值都放在单个列中。我使用tidyr::pivot_longer()来实现这一点。现在,y变量的数值位于名为value的单个列中。

然后,将每个变量名称的cylvalue列进行嵌套。完成后,您将获得一个三行数据集,每个y变量一行,然后您可以在mutate()中循环遍历数据集,创建您原始尝试中的图形列。

plots2 = mpg %>%
     select_if(is.numeric) %>% 
     dplyr::select(-year) %>% 
     pivot_longer(cols = -cyl) %>% 
     nest(data = -name) %>%
     mutate(ggplots = map(data, 
                          ~ggplot(data = .x) + geom_point(aes(x = cyl, y = value)))

这是什么魔法啊 :D 太棒了我的朋友 :) - Shery

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