继续上次课的内容,今天我们继续讲解如何使用 ggraph 包的网络图层绘制城市间专利合作网络。
也可以补充学习系列课程「ggplot2 数据可视化」的网络图绘制课时:https://rstata.duanshu.com/#/brief/course/9d8e0cc791644376979d78edc73eb18a
首先还是加载 R 包和读取相关的数据,注意这里加载了 tidygraph 和 ggraph 包。
library(tidyverse) |
#> # A tibble: 12,316 × 7 |
# 中国地图通常使用这样的坐标系 |
#> # A tibble: 12,312 × 3 |
计算城市质心位置:
# 城市质心位置 |
#> # A tibble: 371 × 4 |
计算每个 from 出发的总 value,然后按照 sum 排序:
df %>% |
这样按照由低到高的顺序排列的目的是为了让高 sum 的边绘制到上面。在 ggplot2 绘图中,最先被绘制的线条会被绘制在下面,最后绘制的线条会盖住前面的线条。在后面的代码中我会把高 sum 的一些边设置成彩色,通过这样的排序就可以让彩色的线条浮在上面不被遮盖。
把 df 转换网络数据:
df %>% |
注意,要先给 df 排序再把其转换成网络数据。这样 graphdf 数据依然会保留 df 的顺序,这样 df 的排序才会对后面网络图的绘制生效。
简化地图数据使得图表绘制的更快:
city %>% |
在正式绘图前,我们先了解主要用的几种图层。为了绘图代码的简洁,我把部分代码存放在了 basemap.R 中:
basemap <- function(plot) { |
首先是 geom_edge_bundle_force() 图层。该图层是基于力导向算法(force-directed algorithm),模拟物理力(如弹簧力)来将边捆绑在一起。通过模拟节点和边之间的相互作用力,使得边在图中自然地聚集在一起。但是这个计算是非常耗时的,因此它会把计算结果临时存储起来,所以第一次运行的时候会很费时间,但是之后就快多了。
ggraph(graphdf, x = X, y = Y) %>% |
![]()
geom_edge_bundle_path() 是基于路径捆绑(path bundling)算法,将边沿着预定义的路径进行捆绑。通常使用层次结构或树状结构来定义路径。这个速度会更快一些:
ggraph(graphdf, x = X, y = Y) %>% |
![]()
geom_edge_bundle_minimal():是最小生成树,最快,但是最粗糙:
ggraph(graphdf, x = X, y = Y) %>% |
![]()
下面我们使用 geom_edge_bundle_path() 绘制,然后给图表添加更多细节。这里细节太多,我还是不在讲义里面一句句解读了,还是推荐大家结合视频讲解观看。
df %>% |
此处代码需下载讲义材料查看~
![]()
这样我们就绘制好了这幅地图,感兴趣的小伙伴也可以试试区县和省份的。
点击这里跳转到 RStata 短书平台获取附件:使用 R 语言绘制城市间专利合作申请数量网络图(二)
评论