r - ggplot2 中的可选美学
问题描述
我正在尝试为仪表板构建一个通用功能。用户可以输入一个字符值来表示颜色美学,但如果它是 NA 则什么都不做。
当!is.na(input)
行为应该与
ggplot(data, aes_string(x = "Date", colour = input)) +
geom_density()
否则它应该与
ggplot(data, aes_string(x = "Date")) +
geom_density()
有没有一种方法不需要我将整个代码集分成两部分?
解决方案
您可以将默认颜色参数设置为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")
推荐阅读
- c# - 为什么 C# 针对 ushorts 上的模运算发出错误“无法隐式地将 int 转换为 ushort”?
- python - pandas 过滤是否支持别名?
- python - 检查字符串是否为回文返回错误结果
- javascript - 单击外部时如何关闭菜单?
- python - 为什么我的数组没有初始化?Numpy - 错误
- javascript - 为什么输入中的值没有加载来自 vuex 的值?
- ios - 应用程序在模拟器上完美运行,上传到 AppStore 后 - 找不到 pod
- java - 如何在 JFrame 中将绘制的内容居中?
- javascript - ParseInt 方法在解析负值时返回 NaN
- c - 带有 memcpy 的 dest 对象中缓冲区溢出的编译器警告/错误