【发布时间】:2018-05-26 15:45:17
【问题描述】:
我在 igraph 中使用社区检测对图进行聚类。我想要的是在社区之间的边缘中间添加一个三角形或正方形的形状。社区之间的边缘已经有不同的颜色,但我想用黑白打印,这就是我想这样做的原因。 谢谢
【问题讨论】:
标签: igraph
我在 igraph 中使用社区检测对图进行聚类。我想要的是在社区之间的边缘中间添加一个三角形或正方形的形状。社区之间的边缘已经有不同的颜色,但我想用黑白打印,这就是我想这样做的原因。 谢谢
【问题讨论】:
标签: igraph
解决这个问题有两个部分:
此答案完全针对第 1 部分,但第 2 部分的答案并不完美。
library(igraph)
g <- graph_from_literal(1-2-3-4-1, 2-5-4, 1-5,3-5,
2-6, 1-9, 6-7-10-8-6, 6-9-10)
CL = cluster_louvain(g)
set.seed(1234)
plot(CL, g)
我设置了随机种子,以便我们以后可以得到相同的情节 进行比较。
这很简单。只需检查端点是否 每条边都在相同或不同的社区中。为了 为了进行这种比较,分配集群很方便 每个顶点的数量作为一个属性。
## create a cluster label for each vertex
V(g)$cluster = 0
for(i in 1:length(CL)) {
V(g)[CL[[i]]]$cluster = i }
## identify the cross-cluster edges and check
XCE = which(V(g)[ends(g, E(g))[,1]]$cluster !=
V(g)[ends(g, E(g))[,2]]$cluster)
E(g)[XCE]
+ 2/16 edges (vertex names):
[1] 1--9 2--6
我们看到这已经正确识别出 顶点 1 和 9 以及顶点 2 和 6 之间的边为 连接不同社区的边缘。
这里的想法是使用边缘标签来指示边缘 社区之间。边缘标签是文本。如果你想要 一个文本标签,这是一个完整的解决方案。但如果你想要一个符号, 您仅限于可以在文本中制作的那些符号。我试过了 使用许多 Unicode 符号字符但没有成功。一个 以前的 SO 问题 Is there an argument to force UTF8 in igraph functions?问 如何使用Unicode,但没有得到答案。我是成功的 使用扩展的 ASCII 字符。我在下面使用 ¤,但其他一些 尝试是:‡¤•º§
## Create edge labels
EdgeLabel = rep("", ecount(g))
## Potential symbol characters: ‡ ¤ • º §
EdgeLabel[XCE] = "¤"
set.seed(1234)
plot(CL, g, edge.label=EdgeLabel, edge.label.cex=1.5)
【讨论】: