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)) %>%
...
取以下数据
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)) %>%
...