首页 > 解决方案 > ggplot2 中的可选美学

问题描述

我正在尝试为仪表板构建一个通用功能。用户可以输入一个字符值来表示颜色美学,但如果它是 NA 则什么都不做。

!is.na(input)行为应该与

ggplot(data, aes_string(x = "Date", colour = input)) +
    geom_density()

否则它应该与

ggplot(data, aes_string(x = "Date")) +
    geom_density()

有没有一种方法不需要我将整个代码集分成两部分?

标签: rggplot2

解决方案


您可以将默认颜色参数设置为NULL,这将使其成为可选。例如:

library(tidyverse)
theme_set(theme_bw())

pfnc = function(data, x, colour=NULL) {
  ggplot(data, aes_string(x=x, colour=colour)) +
    geom_density()
}

pfnc(mtcars, "hp")
pfnc(mtcars, "hp", "factor(cyl)")
pfnc(iris, "Petal.Width")
pfnc(iris, "Petal.Width", "Species")

在此处输入图像描述

另一种选择是使用...参数,它允许使用任意美学映射:

pfnc = function(data, x, ...) {
  ggplot(data, aes_string(x=x, ...)) +
    geom_density()
}

pfnc(iris, "Petal.Width")
pfnc(iris, "Petal.Width", colour="Species", fill="Species")
pfnc(midwest, "popdensity", colour="state", linetype="factor(inmetro)") +
  scale_x_log10()

在此处输入图像描述

aes_string只是“软弃用”,所以它会存在一段时间。但是如果你想避免aes_string,你可以使用整洁的评估。这需要更多的工作,也不能直接将表达式字符串(例如,“factor(cyl)”)作为参数(尽管也可能有一些方法可以使其工作)。

pfnc = function(data, x, colour=NULL) {
  
  x = as.name(x)
  if(!is.null(colour)) {
    colour=as.name(colour)
  }
  
  ggplot(data, aes(x={{x}}, colour={{colour}})) +
    geom_density()
}

pfnc(mtcars, "hp")
pfnc(mtcars %>% mutate(cyl=factor(cyl)), "hp", "cyl")

推荐阅读