グラフにマップしたいスクリプトからのノードがいくつかあります。以下では、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()
しかし、私は画像に示されているようなものが欲しいです。
最初の画像の矢印の頭と赤い色のエッジが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()
完全を期すためだけにこれを入れました。 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()
通常の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 。
グラフの代わりに 有向グラフ を使用する必要があります。
G = nx.DiGraph()
次に、使用するEdgeカラーのリストを作成し、nx.draw
(@Mariusで表示)に渡します。
これをすべてまとめると、以下の画像が得られます。まだあなたが見せている他の写真とはまったく異なります(エッジの重みがどこから来ているのかわかりません)が、もっと近い!出力グラフの外観をさらに制御する場合(たとえば、矢印のように見える矢印を取得する場合)、 NetworkX with Graphviz を確認します。
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)
したがって、再びプロットされます。