我正在创建一个自定义函数,使用
ggplot2
和 geom_col()
生成条形图。
我的目标是使该函数能够动态分配单一颜色或基于分组变量的颜色,以达到
fill
的美感。这是我开发的代码:
library(ggplot2)
library(dplyr)
library(RColorBrewer)
f1 <- function(data, x, y, z, single_color=FALSE, color="red") {
data <- data %>%
count({{x}})
if (single_color) {
p <- ggplot(data, aes(x = factor({{ x }}), y = {{ y }})) +
geom_col(width = 0.6, fill = color) +
theme_minimal()
} else {
p <- ggplot(data, aes(x = factor({{ x }}), y = {{ y }}, fill = factor({{ z }}))) +
geom_col(width = 0.6) +
theme_minimal() +
scale_fill_brewer(palette = "Set1")
}
return(p)
}
f1(mtcars, cyl, n, cyl, single_color=TRUE, color="blue")
f1(mtcars, cyl, n, cyl, single_color=FALSE)
我正在考虑是否有更直接的方法,比如:
f1 <- function(data, x, y, z) {
z <- ensym(z)
ggplot(data, aes(x = factor({{x}}), y = {{y}}, fill= !!z)) +
geom_col(width = 0.6) +
scale_fill_brewer(palette = "Set1")
}
总结我的问题:
z
是否可以同时作为列名和字符串?
相关链接:
如果我理解正确,您希望参数
z
是代表列名的符号,或者是代表颜色的字符串。我想这是可能的,尽管有点复杂:
library(ggplot2)
f1 <- function(data, x, y, z) {
is_column <- deparse(substitute(z)) %in% names(data)
ggplot(data, aes(x = factor({{x}}), y = {{y}})) +
do.call("geom_col", c(list(width = 0.6),
if(is_column) list(mapping = aes(fill = factor({{z}}))),
if(!is_column) list(fill = z)))
}
测试我们得到
f1(mtcars, cyl, mpg, cyl)
和
f1(mtcars, cyl, mpg, "blue")