igraph:在社区之间向边缘添加形状

时间:2018-05-26 15:45:18

标签: igraph

我在igraph中使用社区检测来聚类图形。我想要的是在社区之间的边缘中间添加像三角形或正方形的形状。社区之间的边缘已经有不同的颜色,但我想用黑白打印,这就是我想要这样做的原因。 感谢

1 个答案:

答案 0 :(得分:0)

解决这个问题有两个部分:

  1. 查找要标注的边缘 和
  2. 在这些边上添加符号。
  3. 这个答案完全解决了第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)
    

    Unlabeled graph

    我设置了随机种子,以便我们以后可以得到相同的图 为了比较。

    第1部分。找到社区之间的边缘

    这很简单。只需检查端点是否存在 每个边缘都在相同或不同的社区。为了 为了进行这种比较,分配集群很方便 每个顶点的数量作为属性。

    ## 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之间的边缘为 连接不同社区的边缘。

    第2部分注释跨社区边缘

    这里的想法是使用边缘标签来指示边缘 社区之间。边缘标签是文本。如果你想 一个文本标签,这是一个完整的解决方案。但如果你想要一个符号, 您仅限于可以在文本中使用的符号。我试过了 使用许多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)
    

    Labeled Graph