如何使用另一个变量对在 geom_segment 中创建的箭头进行加权和标记
Posted
技术标签:
【中文标题】如何使用另一个变量对在 geom_segment 中创建的箭头进行加权和标记【英文标题】:How to weight and label arrows created in geom_segment using another variable 【发布时间】:2021-11-14 12:53:11 【问题描述】:考虑这个数据框:
data <- data.frame(ID = rep(1, 6),
Loc = c("A","B","D","A","D","B"),
TimeDiff = c(NA, 4.5,2.2,2.1,3.4,7.2))
我们有相同的ID
,在多个位置进行观察 (Loc
)。观察按它们发生的顺序排列,所以第一个观察在Loc == A
,第二个观察在Loc == B
,依此类推。 TimeDiff
是每次连续观察之间的时间段。我制作了以下图表以显示Loc
s 之间的“路径”随着时间的推移:
library(tidyverse)
data%>%
mutate(RowNumber = row_number(), xend = lead(Loc), yend = lead(RowNumber))%>%
ggplot()+
geom_segment(aes(x = Loc, y = RowNumber, xend = xend, yend = yend), arrow = arrow(), size = 2)
我的主要问题:我们如何根据变量TimeDiff
对每个箭头的大小进行加权,以及如何用TimeDiff
的相应值标记每个箭头?表示连接前两个观察值的箭头,其中Loc == A
和Loc == B
将比后面的箭头粗,因为两个观察值之间的TimeDiff
(4.2) 更大。
一个附带问题:
注意Loc
的 3 个级别包括A
、B
和D
。假设我想在B
和D
之间包含另一个级别C
。这怎么能扔进去?
【问题讨论】:
【参考方案1】:嗯,不完全是一个漂亮的数字,但希望这足以让你开始。关键是将size
放在aes
中,并使用scale_size_identity()
将其链接到您的变量之一。
所以在这种情况下,所有段的大小不是由size = 2
控制,而是由TimeDiff
中的值控制,例如4.5
、2.2
等。请注意,我将 NA
替换为 0
用于调用 size
,并将 "NA"
替换为标签。
library(tidyverse)
dat <- data.frame(ID = rep(1, 6),
Loc = c("A","B","D","A","D","B"),
TimeDiff = c(NA, 4.5,2.2,2.1,3.4,7.2)) %>%
mutate(RowNumber = row_number(),
xend = lead(Loc),
yend = lead(RowNumber))
dat %>%
ggplot(aes(x = Loc, y = RowNumber, xend = xend, yend = yend))+
geom_segment(aes(size = replace_na(TimeDiff, 0)), arrow = arrow()) +
geom_label(aes(label = replace_na(TimeDiff, "NA"))) +
scale_size_identity()
#> Warning: Removed 1 rows containing missing values (geom_segment).
由reprex package (v2.0.0) 于 2021-09-20 创建
【讨论】:
【参考方案2】:这是一个稍微修改数据的可能解决方案。
缺点是硬编码nudge_x
和nudge_y
:
# modified data NA replaced by 0 and last value replaced by NA as we only have 5 differences in 6 datapoints
data <- data.frame(ID = rep(1, 6),
Loc = c("A","B","D","A","D","B"),
TimeDiff = c(0, 4.5,2.2,2.1,3.4,NA))
library(tidyverse)
data%>%
mutate(RowNumber = row_number(), xend = lead(Loc), yend = lead(RowNumber))%>%
ggplot()+
geom_segment(aes(x = Loc, y = RowNumber, xend = xend, yend = yend),
arrow = arrow(), size = data$TimeDiff) +
geom_label(aes(x = Loc, y = RowNumber, xend = xend, yend = yend, label = data$TimeDiff),
nudge_x = c(0.3, 0.5, -1, 1, -0.7),
nudge_y = seq(0.2,6, 0.1))
【讨论】:
以上是关于如何使用另一个变量对在 geom_segment 中创建的箭头进行加权和标记的主要内容,如果未能解决你的问题,请参考以下文章
Geom_segment 没有读取缺失的美学:x、y、xend 和yend Piper Plot
如何使用基于令牌的身份验证对在浏览器中输入 url 的用户进行身份验证?