提问人:TY Lim 提问时间:3/14/2023 最后编辑:M--TY Lim 更新时间:3/14/2023 访问量:72
使用 ggplot2 的条件分面规范
Conditional facet specification with ggplot2
问:
我正在制作几个图,为了灵活起见,我计划将其包装在函数中,作为其中的一部分,我想根据某些条件为这些图指定分面。
具体来说,我有一个列表(在其他地方指定),我用它来对数据执行其他几个操作。我希望我的绘图函数能够自动使用 如果只有一个 ,或者如果 中指定了两个或多个变量,则使用前两个变量。grouping_vars
facet_wrap
grouping_var
grouping_var
facet_grid
例如,如果基本情节是这样的
mtcars %>% ggplot() + geom_point(aes(x = hp, y = mpg))
如果我指定 ,我想得到,实际上,grouping_vars <- c("cyl")
mtcars %>% ggplot() +
geom_point(aes(x = hp, y = mpg)) +
facet_wrap(~cyl)
而如果我指定,我想得到grouping_vars <- c("cyl", "carb")
mtcars %>% ggplot() +
geom_point(aes(x = hp, y = mpg)) +
facet_grid(vars(cyl), vars(carb))
mtcars %>% ggplot() +
geom_point(aes(x = hp, y = mpg)) +
{if(length(grouping_vars==1)) facet_wrap(grouping_vars[[1]])} +
{if(length(grouping_vars>=2)) facet_grid(vars(grouping_vars[[1]]), vars(grouping_vars[[2]]))}
但它似乎不起作用。除其他外,如果 中只有一个元素,它给了我 .grouping_vars
Error in grouping_vars[[2]] : subscript out of bounds
有没有办法像这样有条件地指定分面?
答:
5赞
teunbrand
3/14/2023
#1
按照这里小插曲中的建议,我们应该能够按如下方式使用代词:vars()
.data
library(ggplot2)
plot_mtcars <- function(grouping_vars = NULL) {
p <- ggplot(mtcars) +
geom_point(aes(x = hp, y = mpg))
if (length(grouping_vars) == 1) {
p <- p + facet_wrap(vars(.data[[grouping_vars]]))
} else if (length(grouping_vars) == 2) {
p <- p + facet_grid(vars(.data[[grouping_vars[1]]]),
vars(.data[[grouping_vars[2]]]))
}
p
}
plot_mtcars("cyl")
plot_mtcars(c("cyl", "vs"))
由 reprex 软件包 (v2.0.0) 于 2023-03-14 创建
3赞
M--
3/14/2023
#2
我们可以创建一个自定义函数,用于将变量传递给 。get
ggplot
conditional_facet <- function(data, x, y, grp) {
require(ggplot2)
require(dplyr)
data %>%
ggplot() +
geom_point(aes({{x}}, {{y}})) -> gp
if(length(grp) == 1) {
gp + facet_wrap(~get(grp)) -> gp_out
} else if (length(grp) == 2) {
gp + facet_grid(vars(get(grp[1])), vars(get(grp[2]))) -> gp_out
} else {
gp -> gp_out
}
return(gp_out)
}
grouping_vars <- c("cyl")
conditional_facet(mtcars, hp, mpg, grouping_vars)
grouping_vars <- c("cyl", "carb")
conditional_facet(mtcars, hp, mpg, grouping_vars)
创建于 2023-03-14 通过 reprex 包 (v2.0.1)
评论