r 比例 alpha 不连续

r scale alpha not continuous

取以下数据

df <- data.frame(ID = c(1, 1, 2, 2, 3, 3),
                 cond = c(2, 2, 2, 2, 1, 1),
                 Time = c(1,2,1,2,1,2),
                 State  = c(0, 0, 0, 1, 1, 0),
                 eyes = c(2, -3, -2, 1, 0, -2),
                 combination = c("1", "1","2", "2", "3", "3"))
df$cond <- factor(df$cond,levels = c("1", "2"))
ggplot(df, aes(x = Time, y = eyes)) +
  ggforce::geom_link2(aes(group=ID, color = cond, alpha = State), size = 5, n = 500, lineend = "round") +
  scale_color_manual(values=c("#CC6666", "#9999CC")) +
  scale_alpha_continuous(range = c(0.01, 0.9)) +
  scale_shape_manual(values=c(13,15)) +
  
    theme(legend.title=element_blank(),
        axis.title.x=element_text(size = 12),
        axis.title.y=element_text(size = 12),
        plot.title = element_text(hjust = 0.5, size = 15),
        axis.text.x= element_text(color = "black"),
        axis.text.y= element_text(color = "black"),
        axis.line = element_line(colour = "black"),
        plot.background = element_rect(fill = "white"),
        panel.background = element_rect(fill = "white"))

这会产生下图:

我试图通过连续改变 alpha 使第 2 行和第 3 行在 x-axis 中出现/消失。尽管线条是在两个值 (0, 1) 之间绘制的,但 alpha 似乎并没有在整个线条上均匀变化(从值 0 的 0.01 alpha 和值 1 的 0.9 alpha 开始)。相反,线条几乎立即增长到完整的 0.9 alpha - 为什么会这样,我该如何解决?

如果您不只是定义线条的端点,而是使用插值法定义整条线,则可以为线段设置颜色和 alpha。在您的示例中,您只需要使用序列从起始值到结束:

df <- data.frame(ID = c(rep(1,11),rep(2,11),rep(3,11)),
                 cond = c(rep(2,11),rep(2,11),rep(1,11)),
                 Time = c(seq(1,2,.1),seq(1,2,.1),seq(1,2,.1)),
                 State = c(rep(0,11),seq(0,1,.1),seq(1,0,-.1)),
                 eyes = c(seq(2,-3,-.5),seq(-2,1,.3),seq(0,-2,-.2)))
df$combination = as.character(df$ID)
df$cond = as.factor(df$cond)

但是,尽管 State 变量取值介于 0 和 1 之间,但您用来绘制线条的 ggforce::geom_link2 似乎无法形成漂亮的 alpha 渐变。

出现这种效果是因为 geom_link2() 链接的 500 个点为绘图添加了额外的 alpha。

为了说明,我们可以仅用 20 个点重复绘图,然后变得清晰可见:

ggplot(df, aes(x = Time, y = eyes)) +
  ggforce::geom_link2(aes(group = ID, color = cond, alpha = State),
                      size = 5, n = 20, lineend = "round") +
  scale_color_manual(values = c("#CC6666", "#9999CC")) +
  scale_alpha_continuous(range = c(0.01, 0.9)) +
  scale_shape_manual(values = c(13, 15))

输出:

据我所知,这是 ggforce::geom_link() 函数族的一个限制。但是,您可以对这些点进行插值并尝试计算一个调整后的 alpha 值(例如 alpha ^ 2),它看起来对您的数据来说是可以接受的。

这是根据@aosmith 对您的相关问题的评论中的链接答案改编的方法:。

我将片段分成 100 块,并使用公式定义两个淡入渐变,每个渐变从 State=0 结束的 25% 处变为零。 (在第一行,两端状态0的情况下,我随意使用正弦模式。

seg = 100
df %>%
  group_by(ID) %>%
  summarize(minTime = first(Time), maxTime = last(Time),
            mineyes = first(eyes), maxeyes = last(eyes),
            firstFull = first(State), endFull = last(State)) %>%
  uncount(seg, .id = "frame") %>%
  mutate(frame = (frame - 1)/seg) %>%
  mutate(Time = maxTime * frame + minTime * (1-frame),
         eyes  = maxeyes * frame  + mineyes * (1-frame),
         alpha_OP = case_when(
           firstFull & !endFull ~ 1 - 1.33*frame,
           !firstFull & endFull ~ 1.33*frame - 0.33,
           TRUE ~ sin(frame*50)*0.5  # this is just for fun
         ) %>% pmax(0)) %>%
  
  ggplot(aes(Time, eyes, alpha = alpha_OP, group = ID)) +
  ggforce::geom_link2() +
  scale_alpha(range = c(0,1))
  

编辑:淡入淡出的变化更平滑一些。调整 ^2 幂以移动 alpha 的中点。

....
alpha_OP = case_when(
               firstFull & !endFull ~ 1 - frame^2
               !firstFull & endFull ~ frame^2,
               TRUE ~ sin(frame*50)*0.5  # this is just for fun
             ) %>% pmax(0)) %>%
...