如何以编程方式实现灵活性,以应用列或使用单一颜色来填充 ggplot 中的参数

问题描述 投票:0回答:1

我正在创建一个自定义函数,使用

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
是否可以同时作为列名和字符串?

相关链接:

r ggplot2 evaluation tidyeval
1个回答
0
投票

如果我理解正确,您希望参数

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")

© www.soinside.com 2019 - 2024. All rights reserved.