web-dev-qa-db-ja.com

Pythonでnetworkxを使用して有向グラフを描画する方法は?

グラフにマップしたいスクリプトからのノードがいくつかあります。以下では、Arrowを使用してAからDに移動し、おそらくEdgeの色を赤にします(赤など)。これは基本的に、他のすべてのノードが存在する場合の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()

しかし、私は画像に示されているようなものが欲しいです。enter image description hereenter image description here

最初の画像の矢印の頭と赤い色のエッジが2番目の画像の上にあります。

84
brain storm

赤いエッジのみの矢印を使用して完全に肉付けされた例:

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()

Red edges

71
Marius

完全を期すためだけにこれを入れました。 mariusとmdmlから多くを学びました。エッジの重みは次のとおりです。矢印については申し訳ありません。仕方がないと言っているのは私だけではないようです。 ipythonノートブックではこれをレンダリングできませんでした。pythonから直進しなければなりませんでした。これは、すぐにEdgeウェイトを取得する際の問題でした。

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

G = nx.DiGraph()

G.add_edges_from([('A', 'B'),('C','D'),('G','D')], weight=1)
G.add_edges_from([('D','A'),('D','E'),('B','D'),('D','E')], weight=2)
G.add_edges_from([('B','C'),('E','F')], weight=3)
G.add_edges_from([('C','F')], weight=4)


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

values = [val_map.get(node, 0.45) for node in G.nodes()]
Edge_labels=dict([((u,v,),d['weight'])
                 for u,v,d in G.edges(data=True)])
red_edges = [('C','D'),('D','A')]
Edge_colors = ['black' if not Edge in red_edges else 'red' for Edge in G.edges()]

pos=nx.spring_layout(G)
nx.draw_networkx_Edge_labels(G,pos,Edge_labels=Edge_labels)
nx.draw(G,pos, node_color = values, node_size=1500,Edge_color=Edge_colors,Edge_cmap=plt.cm.Reds)
pylab.show()

enter image description here

42
Back2Basics

通常のnx.drawの代わりに、次を使用できます。

nx.draw_networkx(G[, pos, arrows, with_labels])

例えば:

nx.draw_networkx(G, arrows=True, **options)

次のように**変数を初期化することにより、オプションを追加できます。

options = {
    'node_color': 'blue',
    'node_size': 100,
    'width': 3,
    'arrowstyle': '-|>',
    'arrowsize': 12,
}

また、一部の関数はdirected=True parameterをサポートしています。この場合、この状態はデフォルトの状態です。

G = nx.DiGraph(directed=True)

Networkxリファレンスが見つかりました here

Graph with arrows image

18
Raz

グラフの代わりに 有向グラフ を使用する必要があります。

G = nx.DiGraph()

次に、使用するEdgeカラーのリストを作成し、nx.draw(@Mariusで表示)に渡します。

これをすべてまとめると、以下の画像が得られます。まだあなたが見せている他の写真とはまったく異なります(エッジの重みがどこから来ているのかわかりません)が、もっと近い!出力グラフの外観をさらに制御する場合(たとえば、矢印のように見える矢印を取得する場合)、 NetworkX with Graphviz を確認します。

enter image description here

18
mdml
import networkx as nx
import matplotlib.pyplot as plt

g = nx.DiGraph()
g.add_nodes_from([1,2,3,4,5])
g.add_Edge(1,2)
g.add_Edge(4,2)
g.add_Edge(3,5)
g.add_Edge(2,3)
g.add_Edge(5,4)

nx.draw(g,with_labels=True)
plt.draw()
plt.show()

これは、networkxを使用してpython 3.xを使用して有向グラフを描画する簡単な方法です。単純な表現であり、変更や色付けなどが可能です。生成されたグラフを参照してください here

注:これは単純な表現です。重み付きエッジは次のように追加できます

g.add_edges_from([(1,2),(2,5)], weight=2)

したがって、再びプロットされます。

5