R 在ggplot中为alpha美学使用自定义函数

R 在ggplot中为alpha美学使用自定义函数,r,ggplot2,R,Ggplot2,我希望能够在自定义函数中使用条件映射来映射点(和线)的alpha值。这背后的动机是为了减少数据集部分中的混乱,这对于本图来说并不是很有趣 我知道我可以直接进行alpha缩放,即geom_点(aes(alpha=avg.expression))但我需要在0附近进行对称缩放,因此两个极端都有较高的alpha值,中间值更透明。我希望能够强调变量对不同治疗的反应是递减的还是递增的 很难创建一个最小的工作示例来重现此问题,但我相信以下几点很接近: set.seed(42) ids <-stringi

我希望能够在自定义函数中使用条件映射来映射点(和线)的alpha值。这背后的动机是为了减少数据集部分中的混乱,这对于本图来说并不是很有趣

我知道我可以直接进行alpha缩放,即
geom_点(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)))
set.seed(42)

当我运行你的代码时,我得到了一个与你展示的不同的图,阿尔法在中间似乎减少了,所以我认为你的逻辑可能是正确的。如果上面的图表基于更大的数据集,则可能需要进一步减少alpha,因为许多重叠的半透明线很快就会形成有效的纯色。显示的绘图中的点的形状也不同于代码生成的点的形状。我相信您使用了“shape=21”来创建绘图,该绘图创建了一个既有“填充”又有“颜色”(即圆的边框)的圆。在这种情况下,alpha只会影响填充。这里最简单的解决方案是不使用shape=21。如果您希望点的填充和颜色都具有透明度,请参见此处:@AndrewGustar您是正确的,这不是示例中的绘图,而是实际数据。示例数据确实有一些透明度,但是如果我将
-1
范围中的值的alpha设置为零,我仍然可以看到它们,这意味着还有一些其他层在发挥作用。