ネットワークグラフを動的に描画する


以前の投稿では, NetworkXを用いたネットワークの描画について述べた. 今回は, Plotlyを組み合わせることで, ネットワークグラフを動的に描画する方法を学んだため, そのサンプルコードを残す.

import networkx as nx
import plotly.graph_objects as go

# ランダムなグラフの生成
G = nx.random_geometric_graph(200, 0.125)

# ポジションの取得
pos = nx.get_node_attributes(G, 'pos')

# エッジの取得
edge_x = []
edge_y = []

for edge in G.edges():
    x0, y0 = pos[edge[0]]
    x1, y1 = pos[edge[1]]
    edge_x.extend([x0, x1, None])
    edge_y.extend([y0, y1, None])

edge_trace = go.Scatter(
    x=edge_x, y=edge_y,
    line=dict(width=0.5, color='#888'),
    hoverinfo='none',
    mode='lines')

# ノードの取得
node_x = []
node_y = []

for node in G.nodes():
    x, y = pos[node]
    node_x.append(x)
    node_y.append(y)

node_trace = go.Scatter(
    x=node_x, y=node_y,
    mode='markers',
    hoverinfo='text',
    marker=dict(
        showscale=True,
        colorscale='YlGnBu',
        color=[],
        size=10,
        colorbar=dict(
            thickness=15,
            title='接続数',
            xanchor='left',
            titleside='right'
        ),
        line_width=2))

# ノードの接続数によるカラー設定
node_adjacencies = []
node_text = []
for node, adjacencies in G.adjacency():
    num_neighbors = len(adjacencies)  # 隣接ノードの数を取得
    node_adjacencies.append(num_neighbors)
    node_text.append(f'ノード {node}:{num_neighbors} 接続')

node_trace.marker.color = node_adjacencies
node_trace.text = node_text

# 図の作成
fig = go.Figure(data=[edge_trace, node_trace],
                layout=go.Layout(
                    title='ネットワークグラフの可視化',
                    titlefont_size=16,
                    showlegend=False,
                    hovermode='closest',
                    margin=dict(b=20, l=5, r=5, t=40),
                    annotations=[dict(
                        text="Pythonでのネットワークグラフ",
                        showarrow=False,
                        xref="paper", yref="paper")],
                    xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
                    yaxis=dict(showgrid=False, zeroline=False, showticklabels=False))
                )
fig.show()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です