所以,我在 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)
[
现在我有一个包含如下路线的列表:
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,那就更好了。但当时箭头就足够了。
我想出了一个与 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)
归档时间: |
|
查看次数: |
650 次 |
最近记录: |