【发布时间】:2022-12-18 02:31:39
【问题描述】:
提前感谢您的帮助!
我的问题是,给定一个集合列表,我如何使用网络图可视化两个集合中任何一个的重叠,如下所示?
请随意生成任何集以供演示。或者您可以使用以下简单集。
set.seed(123456)
A <- sample(1:100, 60)
B <- sample(1:100, 50)
C <- sample(1:100, 75)
【问题讨论】:
提前感谢您的帮助!
我的问题是,给定一个集合列表,我如何使用网络图可视化两个集合中任何一个的重叠,如下所示?
请随意生成任何集以供演示。或者您可以使用以下简单集。
set.seed(123456)
A <- sample(1:100, 60)
B <- sample(1:100, 50)
C <- sample(1:100, 75)
【问题讨论】:
在 ggraph 中,我们必须对节点使用 scale_size(),对边使用 scale_edge_width() 以协调比例。 ggplot 中的点大小已经按其半径缩放:
Does size for ggplot2::geom_point() refer to radius, diameter, area, or something else?
因此不需要进行任何转换,除非您希望点的大小与面积的边缘宽度成正比。
用你的样本构建一个 tbl_graph
#edges are determined by length of intersection
edges <- data.frame('from'=c('A','B','C'),'to'=c('B','C','A'),
'weight'=c(length(intersect(A,B)),length(intersect(B,C)),length(intersect(C,A))))
#nodes are weighted by the length of the sample
nodes <- data.frame('name'=c('A','B','C'),size=c(length(A),length(B),length(C)))
tbl_graph <- tbl_graph(nodes=nodes,edges=edges)
现在,如果您直接使用这些大小构建网络,节点之间的距离将自动确定,并且大多数 ggraph 布局将节点之间的距离设置在 0 和 1 之间,从而导致具有超大边和节点的拥挤图形。如果节点之间的距离不重要,我们可以简单地使用比例因子来缩小节点大小和边宽以适合图形。
为了协调宽度和大小,我们将边宽的范围缩放到边宽的最小值和最大值,并将节点大小缩放到节点大小的最小值和最大值,并在节点缩放时乘以 2按直径。这样,节点大小和边缘宽度将按比例缩放到它们的实际值,而不是由布局决定。我还在此处包括其他注释方法以显示节点和边缘的大小。 node_point shape=21 是空心圆。祝你好运!
scale_factor = 0.1
ggraph(tbl_graph) + geom_edge_link(aes(width=weight*scale_factor,label=weight),label_dodge=unit(-4,'mm'),angle_calc='along') +
scale_edge_width(range=c(min(edges$weight)*scale_factor,max(edges$weight)*scale_factor)) +
geom_node_point(aes(size=size * scale_factor),shape=21) + scale_size(range=c(min(nodes$size)*scale_factor*2,max(nodes$size)*scale_factor*2)) +
theme_linedraw() + geom_node_text(aes(label=paste(name,':',size)),nudge_x=-0.1)
【讨论】: