Как рисовать ориентированные графики с помощью networkx в python? - программирование
Подтвердить что ты не робот

Как рисовать ориентированные графики с помощью networkx в python?

У меня есть несколько узлов из script, которые я хочу отобразить на графике. В нижеследующем, я хочу использовать стрелку, чтобы перейти от А к 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()

но я хочу что-то вроде показанного на изображении. enter image description hereenter image description here

Стрелки заголовка первого изображения и краев красного цвета на второе изображение. Спасибо

4b9b3361

Ответ 1

Полностью скругленный пример со стрелками только для красных краев:

import networkx as nx
import numpy as np
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()

Красные края

Ответ 2

Я только включил это для полноты. Я многому научился от 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()

enter image description here

Ответ 3

Вам нужно использовать ориентированный граф вместо графика, т.е.

G = nx.DiGraph()

Затем создайте список цветов краев, которые вы хотите использовать, и передайте их в nx.draw (как показано @Marius).

Объединяя все это, я получаю изображение ниже. Еще не совсем другая картина, которую вы показываете (я не знаю, откуда берутся ваши весы), но гораздо ближе! Если вы хотите больше контролировать, как выглядит ваш выходной граф (например, получить стрелки, похожие на стрелки), я бы проверил NetworkX с Graphviz.

enter image description here

Ответ 4

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

Это просто, как рисовать ориентированный граф, используя python 3.x, используя networkx. простое представление и может быть изменено и окрашено и т.д. Смотрите созданный график здесь.

Примечание. Это просто представление. Взвешенные края можно добавить как

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

и, следовательно, снова построены.