見出し画像

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世紀のフランスを舞台に、様々な登場人物の運命を描いた壮大な物語であり、貧困、社会的正義、愛、贖罪などのテーマを扱っています。

【主な登場人物】

  1. ジャン・バルジャン(Jean Valjean):
    主人公。パンを盗んだ罪で19年間刑務所に入れられた後、仮釈放される。しかし、社会からの差別や偏見に苦しむ。司教ミリエルとの出会いをきっかけに、善良な人間として生き直そうとする。

  2. ジャヴェール(Javert):
    執拗にジャン・バルジャンを追い続ける警察官。法と秩序を絶対視し、自らの職務に対する揺るぎない信念を持つ。

  3. ファンティーヌ(Fantine):
    一人娘コゼットを育てるために苦労する貧しい女性。ジャン・バルジャンが彼女を助ける。

  4. コゼット(Cosette):
    ファンティーヌの娘。幼少時にテナルディエ夫妻に虐待されるが、後にジャン・バルジャンによって救われ、彼の娘として育てられる。

  5. マリウス・ポンメルシー(Marius Pontmercy):
    革命家の若者。コゼットと恋に落ちる。

  6. エポニーヌ(É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の入力欄から取得したデータをアップロードし、次に以下のプロンプトを入力します。

miserables.jsonからPlotlyを利用して3Dネットワークグラフを作成して。登場人物の名前も表示して

すると、データの分析を開始し、以下のように青字でダウンロードリンクが表示されます。

【出力結果】
このリンクをクリックすると、以下のようなファイルをダウンロードできます。ファイルを開くと、ブラウザ上でマウスを操作して、回転、拡大・縮小ができます。

中心に主人公のジャン・ヴァルジャン (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"


いいなと思ったら応援しよう!