Маркировка граничных весов на графиках с самоконтролями - PullRequest
0 голосов
/ 12 февраля 2019

@zohar.kom очень помог мне с его ответом на мой запрос, спрашивающий, как добавить свой собственный словарь меток в ориентированный граф

Можно ли также установить атрибут ребра для включения меток веса ребрадля взвешенных, ориентированных графов, имеющих петли?Например, у меня есть следующее для простого взвешенного ориентированного графа, имеющего пять узлов, помеченных A, B, C, D и E, которые хранятся в словаре, называемом метками.

# Digraph from nonsymmetric adjacency matrix.
 A=npy.matrix([[2,2,7,0,0],[0,2,6,3,0],[0,0,0,2,1],[0,0,0,0,4],
 [4,0,0,0,0]])
 labels={0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'}
 G=nx.DiGraph(A)

 # Set node labels to A, B, C, D, E
 nx.set_node_attributes(G, {k:{'label':labels[k]} for k in 
 labels.keys()})
 D=to_agraph(G)

 # Modify node fillcolor and edge color.
 D.node_attr.update(color='blue',style='filled',fillcolor='yellow')
 D.edge_attr.update(color='blue',arrowsize=1,label="???")
 D.layout('dot')
 D.draw('Graph.eps')

Есть ли способвставить что-нибудь где у меня ???чтобы включить помеченные веса ребер, или, возможно, способ установить атрибут ребра на G перед использованием D = to_agraph (G)?

1 Ответ

0 голосов
/ 12 февраля 2019

Это можно сделать следующим образом:

  1. Считать вес ребер при создании исходного графа (networkx).
  2. Установить атрибут с именем «label» с соответствующим значением вв вашем случае это может быть значение веса, например.

Остальное остается прежним:

import networkx as nx
import numpy as npy

A = npy.matrix([[2, 2, 7, 0, 0], [0, 2, 6, 3, 0], [0, 0, 0, 2, 1], [0, 0, 0, 0, 4],
                [4, 0, 0, 0, 0]])
labels = {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'}
G = nx.from_numpy_matrix(A, create_using=nx.DiGraph)

# Set node labels to A, B, C, D, E
nx.set_node_attributes(G, {k: {'label': labels[k]} for k in labels.keys()})
nx.set_edge_attributes(G, {(e[0], e[1]): {'label': e[2]['weight']} for e in G.edges(data=True)})
D = nx.drawing.nx_agraph.to_agraph(G)

# Modify node fillcolor and edge color.
D.node_attr.update(color='blue', style='filled', fillcolor='yellow')
D.edge_attr.update(color='blue', arrowsize=1)
pos = D.layout('dot')
D.draw('Graph.eps')

Создание графика здесь выполняется с помощью G = nx.from_numpy_matrix(A, create_using=nx.DiGraph), который будет сохранять веса(в отличие от исходной реализации).

Добавление атрибута 'label' к краям выполняется с помощью nx.set_edge_attributes(G, {(e[0], e[1]): {'label': e[2]['weight']} for e in G.edges(data=True)}).

Результат:

enter image description here

...