ChatGPTで3Dネットワークグラフを作成
ChatGPTで簡単に回転、拡大・縮小が可能な3Dネットワークグラフを作成することができます。
なお、作成に当たっては、以下のサイトを参考にさせていただきました。
1.3Dネットワークグラフについて
3Dネットワークグラフは、複雑な関係や接続を視覚化するためのツールで、特に大規模なデータセットや複雑なネットワーク構造を理解するのに役立ちます。
(1) 概要
3Dネットワークグラフは、ノード(頂点)とエッジ(辺)から構成されるグラフ構造を三次元空間で表示するものです。ノードはエンティティ(例えば人、場所、物など)を表し、エッジはこれらのエンティティ間の関係や接続を表します。
(2) 利点
視覚的な洞察の向上: 多くのノードやエッジを含む複雑なネットワークも、3D表示によりより理解しやすくなります。
パターンの発見: 3D空間での視覚化により、二次元では見落としがちなパターンやクラスタを発見しやすくなります。
インタラクティブな探索: ユーザーがネットワークを回転、ズーム、パンすることで、異なる視点からデータを探索できます。
(3) 使用例
ソーシャルネットワーク分析: 人々の関係やコミュニケーションパターンを可視化。
バイオインフォマティクス: 蛋白質相互作用ネットワークや遺伝子ネットワークの解析。
インターネット構造: ウェブサイトやネットワークデバイス間の接続性の視覚化。
物流とサプライチェーン: 複数の拠点間の流通経路を表示。
(4) 作成例
以下にPythonライブラリのPlotlyを使用して簡単な3Dネットワークグラフを作成する例を示します。
import networkx as nx
import plotly.graph_objs as go
# グラフの作成(ノードを20個に)
G = nx.random_geometric_graph(20, 0.5)
# ノードの座標を取得
pos = nx.spring_layout(G, dim=3)
# ノードの座標をリストに分解
x_nodes = [pos[i][0] for i in G.nodes()]
y_nodes = [pos[i][1] for i in G.nodes()]
z_nodes = [pos[i][2] for i in G.nodes()]
# エッジの座標をリストに分解
x_edges = []
y_edges = []
z_edges = []
for edge in G.edges():
x_edges += [pos[edge[0]][0], pos[edge[1]][0], None]
y_edges += [pos[edge[0]][1], pos[edge[1]][1], None]
z_edges += [pos[edge[0]][2], pos[edge[1]][2], None]
# エッジの描画
edge_trace = go.Scatter3d(
x=x_edges, y=y_edges, z=z_edges,
mode='lines',
line=dict(color='black', width=2),
hoverinfo='none'
)
# ノードの描画
node_trace = go.Scatter3d(
x=x_nodes, y=y_nodes, z=z_nodes,
mode='markers',
marker=dict(symbol='circle', size=6, color='red'),
hoverinfo='text'
)
# プロットの作成
fig = go.Figure(data=[edge_trace, node_trace])
# HTMLファイルに保存
html_file_20_nodes = "/mnt/data/3d_network_graph_20_nodes.html"
fig.write_html(html_file_20_nodes)
html_file_20_nodes
【出力結果】
以下のファイルをダウンロードしてください。ファイルを開くと、ブラウザ上でマウスを操作して、回転、拡大・縮小ができます。
2.「レ・ミゼラブル」の登場人物の相関図
GitHubのPlotlyのページに、ヴィクトル・ユーゴーが書いたフランスの有名な歴史小説「レ・ミゼラブル」の登場人物の関係を示すデータがありますので、このデータから3Dネットワークグラフの人物相関図を作成します。
(1) 「レ・ミゼラブル」の概要
「レ・ミゼラブル」(Les Misérables)は、フランスの作家ヴィクトル・ユーゴー(Victor Hugo)によって1862年に発表された小説です。この作品は19世紀のフランスを舞台に、様々な登場人物の運命を描いた壮大な物語であり、貧困、社会的正義、愛、贖罪などのテーマを扱っています。
【主な登場人物】
ジャン・バルジャン(Jean Valjean):
主人公。パンを盗んだ罪で19年間刑務所に入れられた後、仮釈放される。しかし、社会からの差別や偏見に苦しむ。司教ミリエルとの出会いをきっかけに、善良な人間として生き直そうとする。ジャヴェール(Javert):
執拗にジャン・バルジャンを追い続ける警察官。法と秩序を絶対視し、自らの職務に対する揺るぎない信念を持つ。ファンティーヌ(Fantine):
一人娘コゼットを育てるために苦労する貧しい女性。ジャン・バルジャンが彼女を助ける。コゼット(Cosette):
ファンティーヌの娘。幼少時にテナルディエ夫妻に虐待されるが、後にジャン・バルジャンによって救われ、彼の娘として育てられる。マリウス・ポンメルシー(Marius Pontmercy):
革命家の若者。コゼットと恋に落ちる。エポニーヌ(Éponine):
テナルディエ夫妻の娘。マリウスに恋をしているが報われない。
【物語】
物語は1815年のディーニュから始まり、1832年のパリの六月暴動までを描いています。ジャン・バルジャンが仮釈放後に新しい人生を歩むために努力する姿や、彼を追い続けるジャヴェールの執念が描かれます。また、ファンティーヌの悲劇やコゼットの成長、マリウスとの恋愛、エポニーヌの犠牲など、多くのサブプロットが絡み合い、豊かな人間ドラマが展開されます。
【テーマ】
「レ・ミゼラブル」には多くのテーマが含まれています。社会の不公正や貧困、愛と犠牲、贖罪と救済、個人の成長と変革などです。特に、ジャン・バルジャンの人生を通じて、人間の善と悪、そしてその変容の可能性が強調されています。
【映画・舞台化】
「レ・ミゼラブル」は度々映画化や舞台化されており、特にミュージカル版は世界中で非常に人気があります。1980年にフランスで初演され、その後1985年にロンドンで英語版が上演されて以来、数多くの国で公演が行われています。
(2) 登場人物の関係データの取得
以下のリンクをクリックして、Plotlyのデータセットにアクセスします。
https://github.com/plotly/datasets/blob/master/miserables.json
すると、以下のようなページが表示されます。
赤丸のダウンロードボタンをクリックすると、「レ・ミゼラブル」の登場人物の関係データ(JSONファイル)を取得できます。
(3) 3Dネットワークグラフの作成
上記(2)で取得したデータを使用して、ChatGPTで3Dネットワークグラフを作成します。
グラフの作成には、ChatGPTのCode Interpreterが最初から対応しているPythonライブラリのPlotlyを使用しますので、外部からインストールする必要はありません。
最初に、ChatGPTの入力欄から取得したデータをアップロードし、次に以下のプロンプトを入力します。
すると、データの分析を開始し、以下のように青字でダウンロードリンクが表示されます。
【出力結果】
このリンクをクリックすると、以下のようなファイルをダウンロードできます。ファイルを開くと、ブラウザ上でマウスを操作して、回転、拡大・縮小ができます。
中心に主人公のジャン・ヴァルジャン (Jean Valjean)のノードがあり、その上にジャヴェール警部 (Javert)、左側にファンティーヌ (Fantine)とコゼット (Cosette)の名前を見ることができます。ナポレオン(Napoleon)の名前もあります。
実際にファイルをダウンロードして動かすと、その関係性をより理解しやすくなります。
【ChatGPTが生成したPythonコード例】
グラフの作成が上手くいかないときは、以下のコードを参考としてChatGPTに示してください。
import json
import plotly.graph_objects as go
import networkx as nx
# Load the data
with open('/mnt/data/miserables.json') as f:
data = json.load(f)
# Create a graph
G = nx.Graph()
# Add nodes and edges
for node in data['nodes']:
G.add_node(node['name'], group=node['group'])
for link in data['links']:
G.add_edge(data['nodes'][link['source']]['name'], data['nodes'][link['target']]['name'], value=link['value'])
# 3D spring layout for positioning nodes
pos = nx.spring_layout(G, dim=3, seed=42)
# Extract node positions
x_nodes = [pos[node][0] for node in G.nodes]
y_nodes = [pos[node][1] for node in G.nodes]
z_nodes = [pos[node][2] for node in G.nodes]
# Extract edges
x_edges = []
y_edges = []
z_edges = []
for edge in G.edges:
x_edges += [pos[edge[0]][0], pos[edge[1]][0], None]
y_edges += [pos[edge[0]][1], pos[edge[1]][1], None]
z_edges += [pos[edge[0]][2], pos[edge[1]][2], None]
# Create edge trace
edge_trace = go.Scatter3d(
x=x_edges, y=y_edges, z=z_edges,
mode='lines',
line=dict(color='black', width=0.5),
hoverinfo='none'
)
# Create node trace
node_trace = go.Scatter3d(
x=x_nodes, y=y_nodes, z=z_nodes,
mode='markers+text',
marker=dict(symbol='circle', size=6, color='blue'),
text=[node for node in G.nodes],
hoverinfo='text'
)
# Create layout
layout = go.Layout(
title='3D Network Graph of Les Miserables Characters',
showlegend=False,
scene=dict(
xaxis=dict(showbackground=False),
yaxis=dict(showbackground=False),
zaxis=dict(showbackground=False)
)
)
# Create figure
fig = go.Figure(data=[edge_trace, node_trace], layout=layout)
# Save figure as HTML file
fig.write_html("/mnt/data/miserables_3d_network_graph.html")
# Output the path to the saved HTML file
"/mnt/data/miserables_3d_network_graph.html"