在 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
遍历 data
和 showlegend
并在您的绘图函数中删除 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")
}))
我试图根据条件从 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
遍历 data
和 showlegend
并在您的绘图函数中删除 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")
}))