【问题标题】:ggplot alpha = 0 not workingggplot alpha = 0 不工作
【发布时间】:2021-02-15 10:36:08
【问题描述】:

我正在尝试通过调整 alpha 值来复制一些纵向数据的轨迹图,并突出显示随机主题轨迹。我已经走了 95% 的路,除了当 alpha = 0 时我似乎无法获得完全透明的线图(它仍然显示为灰色)。有任何想法吗? - 数据在这里:

https://d.pr/f/iIoE8q+

谢谢。

# Assign random alpha (0 [90%] or 1 [10%]) values
macs <-  ddply(macs, .(id), function(x){
  x$alpha = ifelse(runif(n = 1) > 0.9, 1, 0)
  x
})

# Loess fit
fit <- loess(CD4 ~ time, data=macs, span = 0.5)

# Plot
ggplot(data = macs, aes(x = fitted(fit), y = resid(fit))) +
  geom_point(aes(alpha=1), size = 0.5) +  
  geom_line(aes(alpha=alpha, group=id)) + 
  guides(alpha=FALSE)

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    如果您尝试重现第一个图表,x 轴应该是时间,y 轴是拟合的残差。所以你需要将包含time的原始数据macsfit中的残差结合起来。我会为此使用broom::augment

    对于 alpha 问题,您需要将值转换为因子,然后使用 scale_alpha_discrete

    library(tidyverse)
    library(broom)
    
    fit %>% 
      augment() %>% 
      bind_cols(macs) %>% 
      mutate(alpha = factor(alpha)) %>%
      ggplot(aes(time, .resid)) + 
        geom_line(aes(group = id, alpha = alpha)) + 
        scale_alpha_discrete(range = c(0, 1)) + 
        geom_point(size = 0.5) + 
        guides(alpha = FALSE) + 
        theme_bw()
    

    【讨论】:

    • 这也有效。发布后我意识到我的 x 轴规格不正确,但感谢您指出这一点。
    • 跟进这个,似乎 alpha 的默认范围是c(0.1, 1)。这似乎有效,因为它将范围的底部从 0 更改为 0.1。
    【解决方案2】:

    问题与ggplot 中的color 行为有关。一个简单的解决方法是,当对应的 alpha 为 0 时,将其颜色显式指定为 NA。这是我将在 ggplot 调用之前添加的代码:

    color_rule &lt;- ifelse(macs$alpha == 0, NA, "black")

    ggplot稍作修改:

    ggplot(data = macs, aes(x = fitted(fit), y = resid(fit))) +
      geom_point(aes(alpha=1), size = 0.5) +  
      geom_line(aes(alpha=alpha, group=id), color=color_rule) + 
      guides(alpha=FALSE)
    

    这将为您提供以下情节:

    一个干净、完全透明的geom_linecolor=NA。只是为了比较,如果你从geom_line 中删除color=NA 参数,即使使用alpha=0,你也会得到该行的“默认颜色”:

    【讨论】:

    • 只是在ggplot 3.3.2 中与此作斗争,即使上面的解决方案也没有让我的台词完全消失......还有一些幻线。我不知道的是,有一个默认的 alpha 比例函数有意从 0.1 而不是零开始。解决方案(稍后我可能会发布)是使用scale_alpha_* 系列函数(尤其是scale_alpha_identity)。
    【解决方案3】:

    只需添加scale_alpha(range = c(0, 1))就可以了,因为alpha的默认范围是c(0.1, 1)

    iris$alpha = rep(c(0, 0.5, 1), length = 150)
    ggplot(iris,
           aes(Sepal.Length, Sepal.Width, alpha = alpha, color = Species)) +
      geom_point() +
      scale_alpha(range = c(0, 1)) +
      theme_bw()
    

    【讨论】:

    • 这是正确答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多