在ggplot

时间:2017-04-21 12:18:20

标签: r ggplot2

我希望能够使用自定义函数中的条件映射来映射点(和线)的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)))

这个例子与我正在处理的数据有几个微妙但必不可少的方式:

  1. 我正在处理的数据有很多行
  2. 大多数数据表达式值介于[-1,1]之间,这使得该范围非常混乱
  3. class个变量之间的联系更加紧密,因此大多数idexp的{​​{1}}值不同于classes
  4. 这里有趣的是,如果我查看alpha.func的输出,我会看到3对输入输出。我原以为2,一个用于geom_point,一个用于geom_line。我的印象是,有几个层被覆盖,因此alpha级别不是预期的。

    如果我用我正在处理的实际数据来绘制这个,我会得到类似的东西

    enter image description here

    正如您所看到的,中间部分远非透明,因此这种逻辑中的某些东西不能正常工作。

    有可能实现我的目标吗?考虑到ggplot2库提供的灵活性,我觉得应该有办法做到这一点。

0 个答案:

没有答案