2016-08-17 30 views
1

Rとigraphを使用してAmazonで一緒に購入した政治書籍の視覚化に取り組んでいます。私は、同じ政治的見地の他の本を買うだけで購入したものではないことを示す位置に、ある書籍が落ちる様子を明らかにする形でネットワークグラフを入手することができました。ここではグラフです:R iGraphの頂点間のスペースを増やす

私の問題は、より緊密なクラスタ内のすべてのそれらの本で、それはラベルを読むためにはかなり不可能だということです。クラスタをリンクする少数のタイトルの中間の位置を不明瞭にすることなく、これらのクラスタを拡張したいと考えています。

どのように私はこれを行うことがありますかについてのアイデアはありますか?このグラフを生成するために

は、私がgmlファイルとしてthis dataに読み、次のことをやった:

g<-read.graph("data/polbooks/polbooks.gml", format=c("gml")) 
V(g)$degree <- degree(g, mode="all") 
cut.off <- mean(V(g)$degree) 
sub <- induced_subgraph(g, which(V(g)$degree>cut.off)) 
plot(sub, vertex.shape="none", vertex.size=1,  
    vertex.label.color=ifelse(V(sub)$value=="l", "blue", "red"), 
    layout=layout_with_fr) 

Iは、内蔵のレイアウトのいくつかを試してみたが、それらのどれも実際に産生しません希望の結果。

+0

私はあなたのコードを実行すると、私はテキストに誤り 'エラーを取得します。デフォルト(x、y、labels =ラベル、col = label.color、family = label.family、: 長さがゼロのラベルエド。問題が私の目的であるのか、あなたのコードから抜けているものがあるのか​​どうかはわかりません。クリーンセッションを開始した場合、投稿したコードはシステムにエラーなく実行されますか? – eipi10

+0

私が修正した4行目にタイプミスがありました。再試行する。また、もちろん、データは1行目の別の場所にある可能性があります。 – fraxture

+0

データの場所は問題ではありませんでした。私は修正案を出すかどうかを知らせます。 – eipi10

答えて

3

は、ここで私は、グラフの可読性を向上させる試みに何をやったかです:

  1. 包まれた長い本のタイトル。

  2. フォントサイズを縮小しました。

  3. レイアウトを再現できるようにシードを設定し、好きなように「ランダム」なレイアウトを維持できます。

  4. ノード分離を増やすために、別のSO回答から使用されたグラフレイアウトコード。ここで

が実装です:

## Function to wrap long strings 
# Source: http://stackoverflow.com/a/7367534/496488 
wrap_strings <- function(vector_of_strings,width){ 
    as.character(sapply(vector_of_strings, FUN=function(x){ 
         paste(strwrap(x, width=width), collapse="\n") 
         })) 
    } 

# Apply the function to wrap the node labels 
V(sub)$label = wrap_strings(V(sub)$label, 12) 

## Shrink font 
V(sub)$label.cex = 0.8 

# Function to increase node separation (for explanatory details, see the link below) 
# Source: http://stackoverflow.com/a/28722680/496488 
layout.by.attr <- function(graph, wc, cluster.strength=1,layout=layout.auto) { 
    g <- graph.edgelist(get.edgelist(graph)) # create a lightweight copy of graph w/o the attributes. 
    E(g)$weight <- 1 

    attr <- cbind(id=1:vcount(g), val=wc) 
    g <- g + vertices(unique(attr[,2])) + igraph::edges(unlist(t(attr)), weight=cluster.strength) 

    l <- layout(g, weights=E(g)$weight)[1:vcount(graph),] 
    return(l) 
} 

## Make layout reproducible. Different values will produce different layouts, 
## but setting a seed will allow you to reproduce a layout if you like it. 
set.seed(3) 

今度は、グラフをプロットしてみましょう:

plot(sub, vertex.shape="none", vertex.size=1,  
    vertex.label.color=ifelse(V(sub)$value=="l", "blue", "red"), 
    layout=layout.by.attr(sub, wc=1)) 

enter image description here

+0

素晴らしい答え。ありがとうございました! – fraxture

関連する問題