如何根据 R 中的一个有序列表绘制有向箭头?

Shi*_*sad 5 plot r ggplot2

所以,我在 R 中有一个数据框,其中包含节点号以及不同点的经纬度。其样本数据:

library(tidyverse)

set.seed(4)
node <- seq(1, 10)
lat <- runif(10, 77, 78)
long <- runif(10, 22, 23)

df <- data.frame(node, lat, long)

ggplot()+
  geom_point(aes(x=long, y=lat))+
  geom_text(aes(x=long, y=lat, label=node), size=5)

Run Code Online (Sandbox Code Playgroud)

[积分1

现在我有一个包含如下路线的列表:

route <- c(1,6,2,3,1,10,4,1,5,8,1,3,7,1)

Run Code Online (Sandbox Code Playgroud)

根据路线的顺序,我想在上一张图上绘制箭头,使其看起来像这样:

在此输入图像描述

如何做呢?我可以使用 geom_path 但它会根据数据框的顺序给出顺序。另外,如果可以为不同的路线添加不同的颜色,例如一种颜色为 1->6->2->3->1,另一种颜色为 1->5->8->1,那就更好了。但当时箭头就足够了。

Moj*_*que 2

我想出了一个与 Ben 提供的答案非常相似的答案,只是用一种更灵活的方式来定义着色组,只要起始位置为 1(这部分可能是单行,但我无法快速弄清楚)并使用joins来获取开始和结束段位置。

修改后的路线的代码:

library(tidyverse)

set.seed(4)
node <- seq(1, 10)
lat <- runif(10, 77, 78)
long <- runif(10, 22, 23)

df <- data.frame(node, lat, long)
route <- c(1,6,2,3,1,10,4,1,5,8,1,9,7,1)
Run Code Online (Sandbox Code Playgroud)

创建段数据框:

df2 = tibble(start = route, end = route[c(2:length(route), 1)]) %>% 
  filter(start != end) %>%
  left_join(df, by = c("start" = "node")) %>%
  left_join(df,  by = c("end" = "node"), suffix = c("_start", "_end")) %>%
  mutate(temp_coloring = if_else(start == 1, 1, 0)) %>%
  mutate(coloring = if_else(temp_coloring == 1, cumsum(temp_coloring), NA_real_)) %>%
  fill(coloring) %>%
  select(-temp_coloring) %>%
  mutate(coloring = as_factor(coloring))
Run Code Online (Sandbox Code Playgroud)

绘图:

df %>%
ggplot()+
  geom_point(aes(x=long, y=lat))+
  geom_text(aes(x=long, y=lat, label=node), size=5) +
  geom_segment(data = df2 , aes(x = long_start, y = lat_start, xend = long_end, yend = lat_end, color = coloring),
               arrow = arrow(length = unit(0.1, "inches")))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述