在 listcols 中使用逻辑(ggplot2 版)

Using logic in listcols (ggplot2 edition)

我试图根据条件从 purrr::map 迭代中产生略有不同的结果。假设我有这段代码生成图并将它们存储在数据框中:

library(tidyverse)
#> -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
#> v ggplot2 3.3.5     v purrr   0.3.4
#> v tibble  3.1.6     v dplyr   1.0.7
#> v tidyr   1.1.4     v stringr 1.4.0
#> v readr   2.1.0     v forcats 0.5.1
#> -- Conflicts ------------------------------------------ tidyverse_conflicts() --
#> x dplyr::filter() masks stats::filter()
#> x dplyr::lag()    masks stats::lag()

plots <- iris |>
  group_by(Species) |>
  nest() |>
  mutate(plot = map(data, ~ {
    ggplot(.x) +
      geom_point(aes(x = Sepal.Length, y = Sepal.Width, fill = Petal.Width))
  }))

假设我只想让第一个情节(或物种 ==“setosa”,随便什么)有这样的传说:

plots$plot[[1]]

那么后续剧情就没有这样的图例了:

plots$plot[[2]] +
  guides(fill = "none")

是否可以直接在 mutate/map 调用中执行此操作?

您可以在嵌套数据中添加一列 showlegend,使用 map2 遍历 datashowlegend 并在您的绘图函数中删除 legend 如果 showlegend == FALSE:

library(ggplot2)
library(purrr)
library(dplyr)
library(tidyr)

plots <- iris |>
  group_by(Species) |>
  nest() |>
  mutate(
    showlegend = Species == "setosa",
    plot = map2(data, showlegend, ~ {
      guide <- if (!showlegend) guides(fill = "none")
      ggplot(.x) +
        geom_point(aes(x = Sepal.Length, y = Sepal.Width, fill = Petal.Width)) +
        guide
    })
  )

plots$plot[[1]]

plots$plot[[2]]

使用cur_group_id()标识当前组。还有其他辅助函数,如 cur_group(),可以让您更好地控制每个组内要完成的操作。

library(dplyr)
library(tidyr)
library(ggplot2)
library(purrr)

plots <- iris |>
  group_by(Species) |>
  nest() |>
  mutate(plot = map(data, ~ {
    ggplot(.x) +
      geom_point(aes(x = Sepal.Length, y = Sepal.Width, fill = Petal.Width)) + 
      if (cur_group_id() > 1L) guides(fill = "none")
  }))