のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Pythonのネットワーク、グラフ解析 Network-Xを使って・・・

Sponsored Links

皆さんこんにちは
お元気ですか?私はフリーダム生活です。お盆休み近くて少々嬉しい

本日はネットワークXについて
NetworkXはグラフやネットワーク解析のライブラリです。

実はにこにこタグネットワークでもつくろうかなと考えていたりいなかったりということで
どうプログラムを組もうかの予行演習だったりします。

インストール

毎度おなじみpipを使います。

sudo pip install networkx

例題

import networkx as nx
import matplotlib.pylab as plt

G = nx.Graph()
G.add_node("a")
G.add_nodes_from(["b","c"])
G.add_edge("a","c",weight=3)
G.add_edge("b","c",weight=5)

pos = nx.spring_layout(G)
edge_labels = {("a","c"):3,("b","c"):5}

nx.draw_networkx_nodes(G, pos, node_size=200, node_color="w")
nx.draw_networkx_edges(G, pos, width=1)
nx.draw_networkx_edge_labels(G, pos,edge_labels)
nx.draw_networkx_labels(G, pos ,font_size=16, font_color="r")

plt.xticks([])
plt.yticks([])
plt.show()

ノートを3つ作成し、エッジを2つ生成。それを可視化するプログラムです。

グラフ

nx.Graph() #無向グラフ
nx.DiGraph() #有向グラフ

ノードの生成

グラフを作成する要素は大きく分けて2つあります。
一つ目はノードを作成すること。もう一つはそれをつなぐエッジを構成することです。

ノードの構成は簡単にできます。

G.add_node("a")
G.add_nodes_from(["b","c"])

エッジ

次にエッジですが、

G.add_edge("a","c",weight=3)
G.add_edge("b","c",weight=5)

これだけです。はい、たったこれだけです。

可視化

綺麗に可視化したいのでこちらを使います。
nx.spring_layoutにて最適な位置を計算し、後のdraw(略)でノードの色とかを指定しています。
最後にmatplotlibの可視化機能を使って可視化しています。凄い。

pos = nx.spring_layout(G)
edge_labels = {("a","c"):3,("b","c"):5}

nx.draw_networkx_nodes(G, pos, node_size=200, node_color="w")
nx.draw_networkx_edges(G, pos, width=1)
nx.draw_networkx_edge_labels(G, pos,edge_labels)
nx.draw_networkx_labels(G, pos ,font_size=16, font_color="r")

plt.xticks([])
plt.yticks([])
plt.show()

その他

クラスタリングのアルゴリズムとか

クラスタの係数とか次数とかを使うことができます。

print nx.degree(G)
print nx.connected_components(G)
print nx.clustering(G)

グラフのパラメータとか

print G.number_of_nodes()
print G.number_of_edges()
print G.nodes()
print G.edges()

f:id:tereka:20140812093014p:plain

感想

色々制約とかかければ、ニコニコのグラフも書けると思う。やってみよう