Создание изогнутых краев с помощью NetworkX в Python3 - PullRequest
0 голосов
/ 01 октября 2018

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

Мой предыдущий код выглядит так:

#!/usr/bin/env python3

import networkx as nx
import matplotlib.pyplot as plt

# Graph data
names = ['A', 'B', 'C', 'D', 'E']
positions = [(0, 0), (0, 1), (1, 0), (0.5, 0.5), (1, 1)]
edges = [('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('D', 'A')]

# Matplotlib figure
plt.figure('My graph problem')

# Create graph
G = nx.MultiDiGraph(format='png', directed=True)

for index, name in enumerate(names):
    G.add_node(name, pos=positions[index])

labels = {}
for edge in edges:
    G.add_edge(edge[0], edge[1])
    labels[(edge[0], edge[1])] = '{} -> {}'.format(edge[0], edge[1])

layout = dict((n, G.node[n]["pos"]) for n in G.nodes())
nx.draw(G, pos=layout, with_labels=True, node_size=300)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)

plt.show()

и дает следующий результат

enter image description here

Как сделать так, чтобы края были "скруглены", чтобы они не перекрывались?

1 Ответ

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

Как упоминает Пол, теперь есть возможность использовать FancyArrowPatch в draw_networkx_edges, хотя он работает только на ориентированных графах и также очень медленный.

Для чего-то я собрал некоторыестарый код, который у меня был, который использует пакет bezier для создания хороших изогнутых ребер из графика NetworkX (или любого списка ребер, на самом деле) и построения их.Это может быть полезно: https://github.com/beyondbeneath/bezier-curved-edges-networkx

Пример изображения с использованием SNAP Facebook набора данных и макета ForceAtlas2:

enter image description here

...