いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】ネットワークをくっつけたり共通部分を出したりしたい

・お題:似た実験をしたところ、2つのデータセットを得た。それぞれからネットワークを作成したところ、どうやら被っているところと違うところがあるらしい。これらを可視化したい。

 

・networkxの公式サイトを参考にした。正しくはそちらを参照いただきたい。

networkx.org

・とりあえず、データセットを2つ作成した。

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(seed=1234)

G = nx.Graph()
G.add_edges_from([("a", "b"),
                  ("a", "c"),
                  ("a", "d"),
                  ("a", "e"),
                  ("e", "f"),
                  ("e", "g"),
                  ("e", "h"),
                  ("e", "i")])
nx.draw(G, with_labels = True)
plt.title("graph_G")
plt.show()

H = nx.Graph()
H.add_edges_from([("a", "b"),
                  ("a", "c"),
                  ("a", "d"),
                  ("a", "e"),
                  ("a", "j"),
                  ("a", "k"),
                  ("k", "l"),
                  ("k", "m"),
                  ("k", "n")])
nx.draw(H, with_labels = True)
plt.title("graph_H")
plt.show()

・次に、GとHをくっつけてみる。

R = nx.compose(G, H)
nx.draw(R, with_labels = True)
plt.title("graph_R")
plt.show()

・次に、GとHで被っているところを抽出してみる。

R2=nx.intersection(G, H)
nx.draw(R2, with_labels = True)
plt.show()

・ついでに、HにあるけどGにないノードを抽出してみる。

H_dake = H.copy()
H_dake.remove_nodes_from(n for n in G if n in H)
nx.draw(H_dake, with_labels = True)
plt.show()

・どこが被っていたか分かるように図示してみたい。とりあえず、くっつけたネットワークRを描いてみる。

np.random.seed(seed=12)

plt.figure(figsize=(7,7))
pos = nx.spring_layout(R, k=0.4)

nx.draw_networkx_nodes(R, pos, node_color="white",alpha=0.7,edgecolors="gray")
nx.draw_networkx_edges(R, pos, alpha=0.5, width=0.5, edge_color="black")
nx.draw_networkx_labels(R, pos)

plt.title("graph_R")
plt.show()

・方針としては、くっつけたネットワークRでノードを打って、そこにGとHでエッジを描いて、さらに被っているところR2のエッジを重ねる。

np.random.seed(seed=12)

plt.figure(figsize=(7,7))
pos = nx.spring_layout(R, k=0.4)

nx.draw_networkx_nodes(R, pos, node_color="white",alpha=0.7,edgecolors="gray")

nx.draw_networkx_edges(G, pos, alpha=0.5, width=0.5, edge_color="green", style="dashdot")
nx.draw_networkx_edges(H, pos, alpha=0.5, width=0.5, edge_color="blue", style="dashdot")
nx.draw_networkx_edges(R2, pos, alpha=0.7, width=3, edge_color="red")

nx.draw_networkx_labels(R, pos,alpha=0.8)

plt.show()



おわり。