【Python】ネットワークをくっつけたり共通部分を出したりしたい
・お題:似た実験をしたところ、2つのデータセットを得た。それぞれからネットワークを作成したところ、どうやら被っているところと違うところがあるらしい。これらを可視化したい。
・networkxの公式サイトを参考にした。正しくはそちらを参照いただきたい。
・とりあえず、データセットを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()
おわり。