如何解决分层时间网络/树图静态,非交互式
我想画一个网络/树图来直观地分析一些复杂的监管数据。
我按照this example创建了一个很好地表示数据结构的共现网络图:
a = 10
def f(x,a=a):
return x + a
a = 3
print(f(1))
由 reprex package (v1.0.0) 于 2021 年 2 月 18 日创建
但是,我想以更有意义的方式使用数据的层次结构 (#library
library(tidyverse)
library(ggnetwork)
library(network)
#> network: Classes for Relational Data
#> Version 1.16.1 created on 2020-10-06.
#> copyright (c) 2005,Carter T. Butts,University of California-Irvine
#> Mark S. Handcock,University of California -- Los Angeles
#> David R. Hunter,Penn State University
#> Martina Morris,University of Washington
#> Skye Bender-deMoll,University of Washington
#> For citation information,type citation("network").
#> Type help("network-package") to get started.
#example data
df <- structure(list(id = c("a","a","b","c","d","d"),level = c(1L,2L,3L,1L,4L,4L),from = c("a","aa1","aa2","bb1","bb2","bb3","cc1","cc2","cc3","dd1","dd2","dd3"),to = c("aa1","dd3","aa3","bb4","cc4","dd4"),year = c(2020L,2019L,2001L,2002L,2000L,2018L,2020L,2017L,2000L)),class = "data.frame",row.names = c(NA,-16L))
# show data
df
#> id level from to year
#> 1 a 1 a aa1 2020
#> 2 a 2 aa1 aa2 2019
#> 3 a 2 aa1 dd3 2001
#> 4 a 3 aa2 aa3 2002
#> 5 b 1 b bb1 2000
#> 6 b 2 bb1 bb2 2019
#> 7 b 3 bb2 bb3 2018
#> 8 b 4 bb3 bb4 2019
#> 9 c 1 c cc1 2020
#> 10 c 2 cc1 cc2 2019
#> 11 c 3 cc2 cc3 2018
#> 12 c 4 cc3 cc4 2017
#> 13 d 1 d dd1 2019
#> 14 d 2 dd1 dd2 2018
#> 15 d 3 dd2 dd3 2001
#> 16 d 4 dd3 dd4 2000
#prepare data
df %>%
mutate(id2=id) %>%
unite(id2,from,to,sep=",") %>%
group_by(id,level,id2) %>%
summarise(code=toString(id2)) -> keywords
#> `summarise()` has grouped output by 'id','level'. You can override using the `.groups` argument.
# build a weighted edge list
e <- keywords$code %>%
str_split(",| and ") %>%
lapply(function(x) {
expand.grid(x,x,w = 1 / length(x),stringsAsFactors = FALSE)
}) %>%
bind_rows
e <- apply(e[,-3],1,str_sort) %>%
t %>%
data.frame(stringsAsFactors = FALSE) %>%
mutate(w = e$w)
#drop loops
e <- group_by(e,X1,X2) %>%
summarise(w = sum(w)) %>%
filter(X1 != X2)
#> `summarise()` has grouped output by 'X1'. You can override using the `.groups` argument.
#make network object
n <- network(e[,directed = FALSE)
# add labels
l <- n %v% "degree_w"
l <- network.vertex.names(n)
network::set.vertex.attribute(n,"label",l)
# add year information as color
network::set.vertex.attribute(n,"year",df$year)
#plot
ggplot(n,aes(x,y,xend = xend,yend = yend)) +
geom_edges(color = "white") +
geom_nodes(color = "grey50") +
geom_nodelabel(aes(label = label,color=factor(year)),label.size = NA) +
scale_size_continuous(range = c(1,6)) +
scale_color_discrete()+
theme_blank() +
theme(panel.background = element_rect(fill = 'lightgrey',colour = "lightgrey")) +
ggtitle("network plot") -> plot
set.seed(23)
plot
) 和时间结构 (level
) 并将数据绘制如下:
- x 轴:
year
按字母顺序排列或连接的id
簇 - y 轴
id's
和level
从 1:4 和 2020-2000 订购
最终的网络图应该类似于:
我正在寻找使用 years
和长数据格式/tidyverse 工作流程的解决方案。不过,我很感激每一个提示。
更新 1:
我发现了一些关于使用 ggplot2
here 根据 x 轴和 y 轴定位节点的提示。我想知道是否有使用 igraph
的解决方案。
更新 2:
Jesse Sadler mentioned 一些与网络分析相关的 R 包(ggplot2
、tidygraph
)。这些包支持 ggplot2/tidyverse 工作流程。但是,我找不到任何方法来使用这些包设计所需的情节。
更新 3:
François Briatte shared 一个非常好的网络分析有用 R 包列表。但是,我找不到解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。