如何使用另一个变量对在 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 是每次连续观察之间的时间段。我制作了以下图表以显示Locs 之间的“路径”随着时间的推移:

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 == ALoc == B 将比后面的箭头粗,因为两个观察值之间的TimeDiff (4.2) 更大。

一个附带问题: 注意Loc 的 3 个级别包括ABD。假设我想在BD 之间包含另一个级别C。这怎么能扔进去?

【问题讨论】:

【参考方案1】:

嗯,不完全是一个漂亮的数字,但希望这足以让你开始。关键是将size 放在aes 中,并使用scale_size_identity() 将其链接到您的变量之一。

所以在这种情况下,所有段的大小不是由size = 2 控制,而是由TimeDiff 中的值控制,例如4.52.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_xnudge_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

如何使用关键部分 - MFC?

如何使用基于令牌的身份验证对在浏览器中输入 url 的用户进行身份验证?

如何使用可选参数对在 ReasionML/BuckleScript 中生成 Js.t 对象的函数进行 curry?

如何使用另一个变量访问对象的变量/方法

如何区分回归分析中的分类变量和有序变量?