Графики краев графиков из графика - PullRequest
1 голос
/ 09 апреля 2019

Имеется ли встроенная функция для добавления меток ребер к графику в библиотеке networkx. AFAIK вы можете установить их с помощью функции nx.set_edge_attributes(). Но мне было интересно, можно ли было бы пропустить это и не делать это вручную, если у вас уже есть информация о метках ребер в структуре вашего графика.

Например, учитывая следующий словарь словарей, в которых ключи - это узлы, а внутренние словари - это метки назначения и края соответственно. Например:

z = {'224': {'0': 'a'}, '0': {'217': 'b', '224': 'k'}, '217': {'220': 'c'}, '246': {'10': 'd'}, '10': {'241': 'f', '246': 'l'},
 '241': {'220': 'g'}, '11': {'22': 'p', '23': 'i'}, '22': {'9': 'p'}}

В вышеприведенном словаре '224 будет узел, связанный с' 0 'с меткой' a '.

Я знаю, что могу создать график, используя:

Z = nx.DiGraph(z)

И вычерчиваем его, используя:

pos = nx.spring_layout(Z)
nx.draw(Z, pos, with_labels=True, font_weight='bold')

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

То, что я до сих пор пробовал, было:

edge_labels = dict()
for (k, v), e in zip(z.items(), Z.edges()):
    for x, y in v.items():
        edge_labels[e] = {'attr1': y}

А затем добавьте эти метки:

nx.set_edge_attributes(Z, edge_labels)

Но выдает ошибку и выдает следующий неправильный вывод при просмотре краев с помощью Z.edges(data=True):

Out[38]: OutEdgeDataView([('224', '0', {'attr1': 'a'}), ('0', '217', {'attr1': 'k'}), ('0', '224', {'attr1': 'c'}), ('217', '220', {'attr1': 'd'}), ('246', '10', {'attr1': 'l'}), ('10', '241', {'attr1': 'g'}), ('10', '246', {'attr1': 'i'}), ('241', '220', {'attr1': '8'}), ('11', '22', {}), ('11', '23', {}), ('22', '9', {})])

Я что-то упускаю здесь очевидное?

Ожидаемый результат должен выглядеть следующим образом:

Out[39]: OutEdgeDataView([('224', '0', {'attr1': 'a'}), ('0', '217', {'attr1': 'b'}), ('0', '224', {'attr1': 'k'}), ('217', '220', {'attr1': 'c'}), ('246', '10', {'attr1': 'd'}), ('10', '241', {'attr1': 'f'}), ('10', '246', {'attr1': 'l'}), ('241', '220', {'attr1': 'g'}), ('11', '22', {'attr1': 'p'}), ('11', '23', {'attr1': 'i'}), ('22', '9', {'attr1': 'p'})])

1 Ответ

0 голосов
/ 09 апреля 2019

networkx имеет функцию draw_networkx_edge_labels , которая позволяет рисовать графические метки.Но это не базовая функциональность графиков, поэтому его использование немного сбивает с толку:

Сначала вы должны создать свой граф, его узлы и ребра.После этого вы должны создать макет графика, а затем использовать его для рисунков.Вот пример:

import networkx as nx

# Create graph
G = nx.DiGraph()
G.add_nodes_from([1,2,3,4,5])
G.add_edges_from([(1,2),(2,3),(2,4),(4,5)])
for n in G.nodes:
    G.nodes[n]['label'] = str(n)*5

# Create labels dicts
labels = {
    n: (G.nodes[n]['label']
        if len(list(nx.all_neighbors(G, n))) > 2
        else '')
    for n in G.nodes
}
edge_labels = {e: str(e) for e in G.edges}

# Create graph layout
layout = nx.spring_layout(G)

# Create label edges
edge_labels_pos = nx.draw_networkx_edge_labels(
    G,
    layout,
    edge_labels=edge_labels
)

# Draw the graph
nx.draw(G, with_labels=True, labels=labels, pos=layout)

Результат будет выглядеть следующим образом:

enter image description here

Но не забудьте заранее создать макети использовать его везде!Если вы будете вызывать функции макета несколько раз, вы получите что-то вроде этого:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...