Re: 最小スパニング・ツリーによる共起ネットワークのEdge強調 (HIGUCHI Koichi) KH Coder 旧掲示板
[ツリー表示] [留意事項] [ワード検索] [過去ログ]

  [No.904] 最小スパニング・ツリーによる共起ネットワークのEdge強調 投稿者:HIGUCHI Koichi  投稿日:2012/02/12(Sun) 16:14:25
最小スパニング・ツリーによる共起ネットワークのEdge強調 (画像サイズ: 640×640 32kB)

こんにちは、樋口です。書き込みありがとうございます。

いえいえ、初心者の方には「マニアック」に見えようかと思いますが、少し手
慣れてきてRも触ってみてという段階の方には、なかなかおもしろいTipsにつ
ながる書き込みと思います。また私にとっても開発のヒントになります。いつ
もありがとうございます。

さて今回は、最小スパニング・ツリー(minimum spanning tree)の観点から、
重要とみられるedgeを検出し、それを赤色で表示するということですね。今回
もかなりおもしろそうと思います。

共起ネットワークを「R Source」形式で保存し、このファイルの末尾に以下を
付け加えて実行してください。色指定の部分は、お好きな色に変更していただ
けます。HTMLのカラーコードが使えます。 http://www.colordic.org/

また「edge.label」の箇所の「#」を削除すると、edgeのjaccard係数が表示さ
れます。確認用に使えるかもしれません。


#---------------------------------------------------------------------
# MSTの検出
mst <- minimum.spanning.tree(
    n2,
    weights = 1 - get.edge.attribute(n2, "weight"),
    algorithm="prim"
)

# MSTに合致するedgeの色を赤く
if (length(edg_col) == 1){
    edg_col <- rep(edg_col, ecount(n2) )
}

for ( i in 1:ecount(n2) ){
    name_n2 <- paste(
        get.edgelist(n2,name=T)[i,1],
        get.edgelist(n2,name=T)[i,2]
    )
    for ( j in 1:ecount(mst) ){
        name_mst <- paste(
            get.edgelist(mst,name=T)[j,1],
            get.edgelist(mst,name=T)[j,2]
        )
        if ( name_n2 == name_mst ){
            edg_col[i] <- "#B22222"                   # ここで色指定
            break
        }
    }
}

# プロット
plot.igraph(
    n2,
    vertex.label        = "",
    vertex.color       =ccol,
    vertex.frame.color =com_col_v,
    vertex.size        =v_size,
    vertex.shape       =v_shape,
    edge.color         =edg_col,
    edge.lty           =edg_lty,
    edge.width         =edg_width,
    #edge.label         =round( get.edge.attribute(n2, "weight"), 3),
    #edge.label.cex     =0.8,
    layout             =lay_f,
    rescale            =F
)

# 語のラベルを追加
lay_f_adj <- NULL
if (smaller_nodes ==1){
    if ( is.null(lay_f_adj) == 1){
        lay_f_adj <- cbind(lay_f_adj, lay_f[,1])
        lay_f_adj <- cbind(lay_f_adj, lay_f[,2] + ( max(lay_f[,2]) - min(lay_f[,2]) ) / 38 )
    }
    text(
        lay_f_adj,
        labels = colnames(d)
                 [ as.numeric( get.vertex.attribute(n2,"name") ) ],
        pos = 4,
        offset = 0.25,
        font = text_font,
        cex = f_size,
        col = "black"
    )
} else {
    text(
        lay_f,
        labels = colnames(d)
                 [ as.numeric( get.vertex.attribute(n2,"name") ) ],
        #pos = 4,
        #offset = 1,
        font = text_font,
        cex = f_size,
        col = "black"
    )
}
#---------------------------------------------------------------------

p.s.
些末なことながら、前から少し気になっていたのですが、「先生」と「さま」
はどちらか片方で十分かと思われます。両方付いていると、いかにも偉そうで
すし (^_^


- 関連一覧ツリー (■ をクリックするとツリー全体を一括表示します)