我希望能够使用自定义函数中的条件映射来映射点(和线)的alpha值。这背后的动机是减少数据集部分的混乱,这对于该图形来说并不是很有趣。
我知道我可以进行直接的alpha缩放,即geom_point(aes(alpha = avg.expression))
,但我需要在0附近进行对称缩放,因此两个极值都有更高的alpha值和中间值更透明。我希望能够强调以不断减少或增加的方式响应不同治疗的变量。
很难创建一个最小的工作示例来重现这个问题,但我相信以下内容非常接近:
set.seed(42)
ids <-stringi::stri_rand_strings(100, 5, pattern = "[A-Z]")
df <- data.frame(id = sample(ids, size = 500, replace = T),
exp = rnorm(500, 0, 2),
class = sample(LETTERS[1:6], size = 500, replace = T),
type = sample(1:2, size = 500, replace = T))
alpha.func <- function(n){
print(n)
n[abs(n) <= 1] <- 0
n[abs(n) > 1 & abs(n) <= 2] <- 0.1
n[abs(n) > 2 & abs(n) <= 4] <- 0.25
n[abs(n) > 4] <- 0.75
print(n)
}
df %>%
group_by(id) %>%
ggplot(., aes(x = class, y = exp, color = as.factor(type), group = id)) +
geom_point(aes(alpha = alpha.func(exp)))+
geom_line(aes(alpha = alpha.func(exp)))
这个例子与我正在处理的数据有几个微妙但必不可少的方式:
class
个变量之间的联系更加紧密,因此大多数id
个exp
的{{1}}值不同于classes
。这里有趣的是,如果我查看alpha.func
的输出,我会看到3对输入输出。我原以为2,一个用于geom_point
,一个用于geom_line
。我的印象是,有几个层被覆盖,因此alpha级别不是预期的。
如果我用我正在处理的实际数据来绘制这个,我会得到类似的东西
正如您所看到的,中间部分远非透明,因此这种逻辑中的某些东西不能正常工作。
有可能实现我的目标吗?考虑到ggplot2库提供的灵活性,我觉得应该有办法做到这一点。