7

R で igraph を使用して小さなネットワークをプロットしようとしています。ネットワーク内の各頂点には、そのラベルに相当する名前があります。各頂点に、そのラベルにちょうど収まる大きさの長方形のシンボルを持たせたいと思います。

これが私の主なインスピレーションです。

ハイパーボリアの地図

igraphでこれを行う最良の方法は何ですか?

編集:詳細

コードはこちら

jsonToNM <- function(jfile, directed=TRUE) {
  # Requires "rjson" and "igraph"

  nm.json <- fromJSON(file=jfile)
  nm.graph <- c()

  # Initialize the graph with the given nodes
  g <- graph.empty(n=length(nm.json), directed=directed)
  # Add their names
  V(g)$name <- names(nm.json)
  V(g)$label <- V(g)$name

  # Now, add the edges
  for(i in 1:length(nm.json)) {
    # If the node has a "connected" field,
    # then we note the connections by looking
    # the names up.
    if(length(nm.json[[i]]$connected > 0)) {
      for(j in 1:length(nm.json[[i]]$connected)) {
        # Add the entry
        g <- g + edge(names(nm.json)[i],
                        nm.json[[i]]$connected[j])
      }
    }
  }

  plot(g, vertex.label.dist=1.5)
}

そして、現在の出力は以下です。

電流出力

私の目標は、ラベルを頂点グラフィックの内側に配置し、頂点の幅を広げてラベルを収容することです。

4

2 に答える 2

9

ここに例があります。汚いトリック (つまり頂点サイズを 200 倍にする) の中で重要なのは、2 つのプロット コマンドを使用することです。これによりstrwidth()、プロット サイズが最初の (空の) プロット。

library(igraph)
camp <- graph.formula(Harry:Steve:Don:Bert - Harry:Steve:Don:Bert,
                      Pam:Brazey:Carol:Pat - Pam:Brazey:Carol:Pat,
                      Holly   - Carol:Pat:Pam:Jennie:Bill,
                      Bill    - Pauline:Michael:Lee:Holly,
                      Pauline - Bill:Jennie:Ann,
                      Jennie  - Holly:Michael:Lee:Ann:Pauline,
                      Michael - Bill:Jennie:Ann:Lee:John,
                      Ann     - Michael:Jennie:Pauline,
                      Lee     - Michael:Bill:Jennie,
                      Gery    - Pat:Steve:Russ:John,
                      Russ    - Steve:Bert:Gery:John,
                      John    - Gery:Russ:Michael)

V(camp)$label <- V(camp)$name
set.seed(42)   ## to make this reproducable
co <- layout.auto(camp)

plot(0, type="n", ann=FALSE, axes=FALSE, xlim=extendrange(co[,1]), 
     ylim=extendrange(co[,2]))
plot(camp, layout=co, rescale=FALSE, add=TRUE,
     vertex.shape="rectangle",
     vertex.size=(strwidth(V(camp)$label) + strwidth("oo")) * 100,
     vertex.size2=strheight("I") * 2 * 100)

igraph 頂点ラベルの幅

ところで。R からテキストの幅を測定する方法がないため、これは SVG グラフィックスではうまく機能しません。SVG デバイスは推測するだけです。

于 2013-01-23T06:49:37.580 に答える