파이썬에서 networkx를 사용하여 방향성 그래프를 그리는 방법?


101

그래프에 매핑하려는 스크립트에서 나오는 노드가 있습니다. 아래에서 Arrow를 사용하여 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()

하지만 이미지에 표시된 것과 같은 것을 원합니다.여기에 이미지 설명 입력 여기에 이미지 설명 입력

첫 번째 이미지의 화살표 머리와 두 번째 이미지의 붉은 색 가장자리.

답변:


86

빨간색 가장자리에만 화살표가있는 완전히 구체화 된 예제 :

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

빨간색 가장자리


1
업데이트 된 두 이미지가 얼마나 다른지 놀랍습니다. 가장자리 색상을 알아내는 데 +1!
mdml

위의 코드에 따라 빨간색이어야하지만 가장자리 (C, E)가 빨간색이 아닌 이유는 무엇입니까?
브레인 스톰

이 화살촉이 관심있는 모서리에만있을 수 없습니까? 예 : (A, C) 및 (C, E)
브레인 스톰

@ user1988876 : 아, 미안합니다. 제가 아직 방향이없는 그래프로 작업 할 때 (C, E)가장자리를 선택했기 때문에 red_edges에서 반환 된 가장자리에서 무작위로 선택했기 때문에 빨간색이 아닙니다 G.edges(). 이어야합니다 red_edges = [('A', 'C'), ('E', 'C')].
Marius

@ user1988876 : 일부 가장자리에만 화살표가있는 것은 draw_networkx_edges(). 코드를 정리하고 DiGraph 문제를 수정했습니다.
Marius 2011

47

나는 완전성을 위해서만 이것을 넣었습니다. 나는 marius와 mdml에서 많은 것을 배웠습니다. 다음은 가장자리 가중치입니다. 화살은 미안 해요. 내가 어쩔 수 없다고 말하는 유일한 사람이 아닌 것 같습니다. 나는 ipython 노트북으로 이것을 렌더링 할 수 없었습니다. 내 가장자리 가중치를 더 빨리 가져 오는 데 문제가되는 Python에서 곧장 가야했습니다.

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

여기에 이미지 설명 입력


9
나는 이것을 실행했고 노드 레이블을 얻지 못했습니다. 다음을 추가해야합니다 node_labels = {node:node for node in G.nodes()}; nx.draw_networkx_labels(G, pos, labels=node_labels)..
MadeOfAir

무 방향 그래프가 이미 있고 그 그래프의 방향성 복사본을 재현하려면 어떻게해야합니까? G.add_edges_from()시작점과 끝점을 수동으로 입력하지 않고 선 을 설정할 수있는 방법이 있습니까? 아마도 dict?
FaCoffee 2015

이 섹션의 첫 번째 코드 줄 (가져 오기 줄 제외)은 그래프 유형과 허용되는 가장자리의 종류를 설정합니다. digraph (더 많은 정보)에서 그래프 (더 적은 정보)로 이동할 수 있지만 정보 나 누락 된 정보를 구성하는 방법 없이는 그래프 (더 적은 정보)에서 digraph (더 많은 정보)로 이동할 수 없습니다. 다른 스택 오버플로 질문에 예를 들어 질문을 올리는 것이 좋습니다.
Back2Basics 2015

1
가장자리에 실제 화살표를 얻을 수 있습니까? 나는 단지 두꺼운 끝이 마음에 들지 않습니다.
Wikunia

1
matplotlib에서 화살촉을 그리는 것은 까다 롭고 현재 NetworkX에서 지원되지 않습니다. pull 요청이 허용됩니다.
Back2Basics 2016 년

33

일반 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 참조는 여기 에서 찾을 수 있습니다 .

화살표 이미지가있는 그래프


21

그래프 대신 방향성 그래프 를 사용해야합니다.

G = nx.DiGraph()

그런 다음 사용하려는 가장자리 색상 목록을 만들고 전달합니다 nx.draw(@Marius 표시).

이 모든 것을 종합하면 아래 이미지가 표시됩니다. 여전히 당신이 보여주는 다른 그림은 아니지만 (당신의 가장자리 가중치가 어디에서 오는지 모르겠습니다), 훨씬 더 가깝습니다! 출력 그래프의 모양을 더 많이 제어하고 싶다면 (예 : 화살표 모양의 화살촉을 얻으려면) Graphviz로 NetworkX를 확인하십시오 .

여기에 이미지 설명 입력


아, 환호합니다. 문서에서 화살표에 대한 주장을 볼 수 있었기 때문에 화살표가 작동하지 않는 이유를 알 수 없었습니다.
Marius 2011

9
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를 사용하여 방향성 그래프를 그리는 방법입니다. 단순한 표현이며 수정 및 색상 등이 가능 합니다 . 여기 에서 생성 된 그래프를 참조 하십시오 .

참고 : 이것은 단순한 표현 일뿐입니다. Weighted Edges는 다음과 같이 추가 할 수 있습니다.

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

따라서 다시 플롯됩니다.


1
import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_node("A")
G.add_node("B")
G.add_node("C")
G.add_node("D")
G.add_node("E")
G.add_node("F")
G.add_node("G")
G.add_edge("A","B")
G.add_edge("B","C")
G.add_edge("C","E")
G.add_edge("C","F")
G.add_edge("D","E")
G.add_edge("F","G")

print(G.nodes())
print(G.edges())

pos = nx.spring_layout(G)

nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, edge_color='r', arrows = True)

plt.show()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.