Пожалуйста, как рисовать мультиграфы на питоне?Я пытался это сделать с помощью библиотек networkx, но рисуется только одно соединение между двумя узлами - PullRequest
0 голосов
/ 16 декабря 2018

Пожалуйста, как рисовать мультиграфы на питоне?Я пытался это сделать, используя библиотеки networkx, но рисуется только одно соединение между двумя узлами

1 Ответ

0 голосов
/ 16 декабря 2018

Если вы делаете что-то подобное, это должно позволить вам нарисовать несколько ребер между одними и теми же узлами.Однако при рисовании они будут перекрываться, потому что они нарисованы как прямые линии.

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

graph = nx.MultiGraph() # Must use MultiGraph rather than Graph

graph.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
print('There are {} nodes in the graph: {}'.format(graph.number_of_nodes(), 
graph.nodes()))

graph.add_edges_from([('A', 'C'), 
                      ('A', 'B'), 
                      ('A', 'E'),
                      ('B', 'E'),
                      ('B', 'D'),
                      ('C', 'A')])
print('There are {} edges in the graph: {}'.format(graph.number_of_edges(), 
graph.edges()))

nx.draw(graph, with_labels = True, font_weight='bold')
plt.show()

# Confirms two edges between A and C
print(graph.number_of_edges('A', 'C'))

Это позволит вам хранить атрибуты на нескольких ребрах между узлами.Я не видел никаких чисто сетевых опций, которые позволили бы вам визуализировать эти строки отдельно.

Вы можете сделать это, используя GraphViz:

Вот документы: https://graphviz.readthedocs.io/en/stable/index.html

Вы можете установить pip с помощью:

pip install graphviz

А затем вам нужно установить исполняемый файл.Я использовал homebrew на Mac, поэтому просто набрал:

brew install graphviz

Вот базовый пример двух узлов, которые указывают друг на друга:

from graphviz import Digraph

g = Digraph()

nodes = ['A', 'B', 'C']
edges = [['A', 'B'],['B', 'C'],['B', 'A']]

for node in nodes:
    g.node(node)

for edge in edges:
    start_node = edge[0]
    end_node = edge[1]
    g.edge(start_node, end_node)

g.view()

Вот результат:

enter image description here

...