получить заказ DiGraph ребра - PullRequest
       5

получить заказ DiGraph ребра

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

вот моя целевая сеть, которую я хочу построить. График сети DiGraph с цветными краями Края имеют свой определенный цвет из цветовой карты.Цветовая карта связана с температурой каждого края.Так для:

номер края: 13 температура: 14 ° C → цвет края должен быть синим, но красным

номер края: 14 температура: 38 ° C → цвет края должен быть краснымно синий

Проблема в том, что я не получаю согласованного порядка краев или цвета ребер.Я не знаю, являются ли ребра или обработчики неупорядоченными.

Проблема уже описана в: https://networkx.github.io/documentation/latest/reference/classes/ordered.html Я использую Python 3.7.Либо nx.DiGraph (), либо nx.OrderedDiGraph () не получают правильный порядок.На самом деле нет ответа, как не допустить, чтобы networkx смешивал порядок ребер.Может ли кто-нибудь помочь мне?:)

Вот мой код, готовый к компиляции:

import networkx as nx
import matplotlib.pyplot as plt
# nodes input
nodes_id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
nodes_x_y = [(1, 1.0), (2, 1.0), (3, 1.0), (4, 1.0), (5, 1.0), (2, 1.5), (3, 1.5), (4, 1.5),
             (5, 1.5), (2, 2.0), (3, 2.0), (4, 2.0), (5, 2.0), (2, 2.5), (3, 2.5), (4, 2.5),
             (5, 2.5), (1, 3.0), (2, 3.0), (3, 3.0), (4, 3.0), (5, 3.0)]
# edges input         those should match together↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ those should match together
# edge labels
edges_id =      [0,     1,     2,    3,    4,    5,   6,    7,    8,    9,    10,   11,   12,   13,   14,    15,  16,   17,   18,   19,   20,   21,   22,    23]
# edge temperatures
edges_tp_forw = [35.0, 33.0, 33.0, 33.0, 24.0, 33.0, 33.0, 33.0, 24.0, 14.0, 38.0, 33.0, 24.0, 14.0, 38.0, 33.0, 40.0, 14.0, 38.0, 33.0, 40.0, 40.0, 38.0, 33.0]
#                     those should match together↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ those should match together
edges_u = [1, 2, 3, 4, 1, 6, 7, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 19, 15, 21, 18, 19, 20, 20]
edges_v = [0, 1, 2, 3, 5, 2, 3, 4, 9, 6, 11, 8, 13, 10, 15, 12, 18, 14, 20, 16, 17, 18, 19, 21]
# graph
G = nx.OrderedDiGraph()
# or: G = nx.DiGraph()
# Add network nodes
for k in nodes_id:
    G.add_node(nodes_id[k], pos=nodes_x_y[k])
# Add network edges
for k in edges_id:
    G.add_edge(edges_u[k], edges_v[k], edge_color=edges_tp_forw[k], name=edges_id[k], labels=edges_id[k])
# position
pos = nx.get_node_attributes(G, 'pos')
# open plot
f = plt.figure()
plt.axis('off')
# draw nodes
nx.draw_networkx_nodes(G, pos=pos, node_size=00, node_shape='o', node_color='grey', font_weight='bold')
# draw node labels
bbox = dict(facecolor='grey',  edgecolor='grey', boxstyle='circle')
nx.draw_networkx_labels(G, dict(enumerate(nodes_x_y)), bbox=bbox, font_size=6)
# draw edges
max_value = max(edges_tp_forw)
# Heatmap color map
edge_cmap = plt.cm.get_cmap('coolwarm')
# draw edges
nx.draw_networkx_edges(G, pos, width=1, edge_color=edges_tp_forw, edge_cmap=edge_cmap, arrows=True)
# draw edge labels
edges_id = tuple(edges_id)
edges = tuple(zip(edges_u, edges_v))
edges_labels_id_tp = [pair for pair in zip(edges_id, edges_tp_forw)]
edges_draw_labels = dict(zip(edges, [elem for elem in edges_labels_id_tp]))
bbox = dict(facecolor='white', edgecolor='grey', boxstyle='round')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edges_draw_labels,     bbox=bbox, font_size=6, rotate=False)
plt.show()
plt.close()

1 Ответ

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

Ваши характеристики полностью в порядке.Это похоже на ошибку в текущей версии networkx.Я бы поднял вопрос об их github.

В качестве обходного пути вы можете использовать мой форк их утилит для рисования, netgraph .Я предписываю использование словарей для указания атрибутов узлов и ребер (если вы хотите, чтобы они различались по узлам / ребрам), чтобы предотвратить именно эту проблему.

enter image description here

import netgraph # install with: pip install netgraph
from matplotlib import colors, cm

# --------------------------------------------------------------------------------
# your specifications

nodes_id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
nodes_x_y = [(1, 1.0), (2, 1.0), (3, 1.0), (4, 1.0), (5, 1.0), (2, 1.5), (3, 1.5), (4, 1.5),
             (5, 1.5), (2, 2.0), (3, 2.0), (4, 2.0), (5, 2.0), (2, 2.5), (3, 2.5), (4, 2.5),
             (5, 2.5), (1, 3.0), (2, 3.0), (3, 3.0), (4, 3.0), (5, 3.0)]
# edges input         those should match together↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ those should match together
# edge labels
edges_id =      [0,     1,     2,    3,    4,    5,   6,    7,    8,    9,    10,   11,   12,   13,   14,    15,  16,   17,   18,   19,   20,   21,   22,    23]
# edge temperatures
edges_tp_forw = [35.0, 33.0, 33.0, 33.0, 24.0, 33.0, 33.0, 33.0, 24.0, 14.0, 38.0, 33.0, 24.0, 14.0, 38.0, 33.0, 40.0, 14.0, 38.0, 33.0, 40.0, 40.0, 38.0, 33.0]
#                     those should match together↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ those should match together
edges_u = [1, 2, 3, 4, 1, 6, 7, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 19, 15, 21, 18, 19, 20, 20]
edges_v = [0, 1, 2, 3, 5, 2, 3, 4, 9, 6, 11, 8, 13, 10, 15, 12, 18, 14, 20, 16, 17, 18, 19, 21]
edges_labels_id_tp = [pair for pair in zip(edges_id, edges_tp_forw)]

# --------------------------------------------------------------------------------
# conversion of your specifications to dictionaries

edges = list(zip(edges_u, edges_v))
node_positions = dict(zip(nodes_id, nodes_x_y))
node_labels = {node : str(node) for node in nodes_id}
color_map = cm.ScalarMappable(norm=colors.Normalize(vmin=min(edges_tp_forw),
                                                     vmax=max(edges_tp_forw)),
                               cmap=plt.get_cmap('coolwarm'))
edge_color = {edge : color_map.to_rgba(val) for edge, val in zip(edges, edges_tp_forw)}
edge_labels = {edge : str(pair) for edge, pair in zip(edges, edges_labels_id_tp)}

fig, ax = plt.subplots(1, 1, figsize=(10,5))
netgraph.draw(edges,
              node_positions       = node_positions,
              node_edge_width      = 0.,
              node_color           = 'lightgray',
              node_labels          = node_labels,
              node_label_font_size = 6,
              edge_color           = edge_color,
              edge_labels          = edge_labels,
              edge_label_font_size = 6,
              rotate               = False,
              draw_arrows          = True,
              ax                   = ax)
fig.tight_layout()
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...