Динамически изменять размер стрелок в сети x на основе списка / dict - PullRequest
0 голосов
/ 07 января 2019

Я могу динамически изменять размер узла или цвет узла, передавая список значений в функцию draw_network. Но как я могу сделать это с ArrowStyle? Скажем, я хотел изменить ArrowStyle (ширина и длина) на основе списка значений. Стрелка не принимает ничего, кроме одного значения типа int.

Вот пример кода:

import matplotlib.patches
import networkx as nx
G = nx.DiGraph()
G.add_edge("reddit", "youtube")
G.add_edge("reddit", "google")
G.add_edge("google", "reddit")
G.add_edge("youtube", "reddit")
print(G.adj)

testArrow = matplotlib.patches.ArrowStyle.Fancy(head_length=.4, head_width=.4, tail_width=.1)


nx.draw_networkx(G,
             arrowsize=30,
             node_size=[5000,50,300],
             arrowstyle=testArrow)

enter image description here

1 Ответ

0 голосов
/ 07 января 2019

Для изменения размеров стрелок:

Согласно документации нет возможности сделать это за один вызов. Однако это можно сделать, нарисовав края по очереди следующим образом:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edge("reddit", "youtube", w=5)
G.add_edge("reddit", "google", w=10)
G.add_edge("google", "reddit", w=30)
G.add_edge("youtube", "reddit", w=20)
print(G.adj)

pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, node_size=[5000, 50, 300])
nx.draw_networkx_labels(G, pos)
for edge in G.edges(data=True):
    w = edge[2]['w']
    nx.draw_networkx_edges(G, pos, edgelist=[(edge[0],edge[1])], arrowsize=w, node_size=[5000, 50, 300])
plt.show()

Что приведет к чему-то вроде этого:

enter image description here

Для изменения размеров ребер:

Существует концептуальная разница между шириной и длиной ребер. В то время как ширина настраивается и может быть легко установлена ​​для каждого ребра, длина определяется положением узлов.

Чтобы изменить ширину ребер аналогично размеру и цвету узлов, вы можете вызвать draw_networkx_edges, а аргумент 'width' принимает либо float, либо массив float.

Для изменения длины ребер вам нужно изменить макет , установленный аргументом pos в nx.draw_networkx. По умолчанию используется расположение пружины.

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