我在igraph中使用社区检测来聚类图形。我想要的是在社区之间的边缘中间添加像三角形或正方形的形状。社区之间的边缘已经有不同的颜色,但我想用黑白打印,这就是我想要这样做的原因。 感谢
答案 0 :(得分:0)
解决这个问题有两个部分:
这个答案完全解决了第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符号字符但没有成功。一个 以前的问题 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)