見出し画像

【Python】Network Xで日本語のナレッジグラフをプロットするサンプルコード

NetworkXとは



NetworkXはPythonでグラフを扱うための強力なライブラリで、グラフ理論の研究やデータの可視化に広く使用されています。

この記事では、NetworkXを使用して日本語のラベルを含むナレッジグラフをプロットする方法を紹介します。これには、matplotlibの日本語フォント設定とNetworkXの基本的なグラフ構築手法が含まれます。

環境設定


まずは必要なライブラリをインストールします。`networkx` と `matplotlib`、および `japanize_matplotlib` を使用します。

!pip install networkx matplotlib
!apt-get -y install fonts-ipafont-gothic
!pip install japanize-matplotlib



サンプルコードの説明


以下のコードは、『ONE PIECE』という人気漫画をモチーフにして、NetworkX ライブラリを使ってナレッジグラフを作成し、主要なキャラクター、場所、イベント間の関係を視覚化するためのものです。


import matplotlib.pyplot as plt 
# フォントキャッシュをリセット
!rm -rf ~/.cache/matplotlib
import networkx as nx
import japanize_matplotlib 
# グラフオブジェクトの作成
G = nx.DiGraph()

# キャラクター、場所、イベントの追加
characters = ["ルフィ", "ゾロ", "ナミ", "サンジ", "ウソップ"]
places = ["イーストブルー", "グランドライン", "ラフテル"]
events = ["大海賊時代"]



for character in characters:
    G.add_node(character, type='character')
for place in places:
    G.add_node(place, type='place')
for event in events:
    G.add_node(event, type='event')

# エッジの追加(関係)
G.add_edge("ルフィ", "ゾロ", relation="仲間")
G.add_edge("ルフィ", "ナミ", relation="仲間")
G.add_edge("ルフィ", "サンジ", relation="仲間")
G.add_edge("ルフィ", "ウソップ", relation="仲間")
G.add_edge("ルフィ", "イーストブルー", relation="出身地")
G.add_edge("ルフィ", "グランドライン", relation="冒険")
G.add_edge("ルフィ", "ラフテル", relation="ゴール")
G.add_edge("ルフィ", "大海賊時代", relation="時代背景")


# グラフの描画位置を指定(spring_layoutはノード間の引力と斥力に基づく配置)
pos = nx.spring_layout(G)

# ノードのタイプに応じた色分け
color_map = {'character': 'lightblue', 'place': 'lightgreen', 'event': 'salmon'}
node_colors = [color_map[G.nodes[node]['type']] for node in G]

# ノードの描画
nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=5000)

# エッジの描画
nx.draw_networkx_edges(G, pos, arrowstyle='->', arrowsize=20)

# ノードラベルの描画
nx.draw_networkx_labels(G, pos, font_size=12,font_family="IPAexGothic")

# エッジラベルの描画
edge_labels = nx.get_edge_attributes(G, 'relation')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels,font_family="IPAexGothic")

# 描画の実行
plt.axis('off')  # 座標軸を非表示にする
plt.show()


コード:https://colab.research.google.com/drive/1ahF5HVmvOIu2xg6SgBBXZEWCgYy5bBPb?usp=sharing


<実行結果>


以下に各部分の詳細な説明をします。

インポートと環境設定

import matplotlib.pyplot as plt
import networkx as nx
import japanize_matplotlib
  • `matplotlib.pyplot`はグラフを描画するためのモジュールです。

  • `networkx`はグラフ理論のデータ構造と操作を提供するライブラリです。

  • `japanize_matplotlib`はmatplotlibで日本語表示を可能にするライブラリです。

!rm -rf ~/.cache/matplotlib
  • このコマンドは、matplotlibのフォントキャッシュをリセットします。これにより、フォントやその他の設定変更が正しく反映されます。

グラフの初期化

G = nx.DiGraph()
  • `DiGraph()`は有向グラフを作成します。これは、エッジに方向性があることを意味し、関係の向き(例: 「ルフィ」から「ゾロ」への「仲間」関係)が表現されます。

ノードの追加

for character in characters:
    G.add_node(character, type='character')
for place in places:
    G.add_node(place, type='place')
for event in events:
    G.add_node(event, type='event')
  • これらの行でキャラクター、場所、イベントの各カテゴリに属するノードをグラフに追加しています。各ノードには、そのタイプ(キャラクター、場所、イベント)が属性として割り当てられます。

エッジの追加

G.add_edge("ルフィ", "ゾロ", relation="仲間")
...
G.add_edge("ルフィ", "大海賊時代", relation="時代背景")
  • これらの行で、ノード間の関係(エッジ)を追加しています。例えば、「ルフィ」から「ゾロ」への「仲間」という関係が示されます。各エッジには関係の種類が`relation`属性として割り当てられています。

グラフのレイアウト設定と描画

pos = nx.spring_layout(G)
  • `spring_layout`は、エッジの長さが一定で、ノード間の斥力に基づく自然な配置を生成します。

nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=5000)
nx.draw_networkx_edges(G, pos, arrowstyle='->', arrowsize=20)
  • ノードとエッジを指定された位置とスタイルで描画します。ノードはタイプに応じて色分けされています。

nx.draw_networkx_labels(G, pos, font_size=12, font_family="IPAexGothic")
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_family="IPAexGothic")
  • ノードとエッジのラベルを描画します。ここで`font_family`に"IPAexGothic"を指定して、日本語が正しく表示されるようにしています。

最終的な表示

plt.axis

('off')  # 座標軸を非表示にする
plt.show()
  • 座標軸を非表示にし、プロットを表示します。これにより、整理された視覚的な表現が得られます。


おわり

このサンプルコードは、基本的なナレッジグラフの作成とプロットにおいて、日本語でのラベル付けを実現する方法を示しています。これにより、日本語のデータを含む複雑な情報構造を視覚的に表現することができます。


この記事が気に入ったらサポートをしてみませんか?