1. ホーム
  2. python

[解決済み] pythonでnetworkxを使用して有向グラフを描くには?

2022-06-23 23:35:12

質問

私は、グラフにマッピングしたいスクリプトから来るいくつかのノードを持っています。以下では、私はAからDに行くために矢印を使用し、おそらくエッジがあまりにも(赤または何か)に着色されていることを望みます。

これは基本的に、他のすべてのノードが存在する場合のAからDへの道のようなものです。各ノードを都市として想像し、AからDへの移動は方向(矢印の頭)を必要とします。

以下のコードは、グラフを構築します。

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values)
plt.show()

のようにしたいのですが、画像にあるような

1枚目の画像の矢印の先と、2枚目の画像に赤色で表示されたエッジ。

どのように解決するのですか?

赤い縁だけに矢印をつけた、完全に肉付けされた例です。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

# Specify the edges you want here
red_edges = [('A', 'C'), ('E', 'C')]
edge_colours = ['black' if not edge in red_edges else 'red'
                for edge in G.edges()]
black_edges = [edge for edge in G.edges() if edge not in red_edges]

# Need to create a layout when doing
# separate calls to draw nodes and edges
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), 
                       node_color = values, node_size = 500)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, edgelist=red_edges, edge_color='r', arrows=True)
nx.draw_networkx_edges(G, pos, edgelist=black_edges, arrows=False)
plt.show()