Показать количество ребер между двумя узлами на графике - PullRequest
0 голосов
/ 19 февраля 2020

Я делаю сетевой график из кадра данных, как показано ниже

import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt

data = {'source': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
        'target': ['B', 'B', 'C', 'D', 'E', 'B', 'C', 'E', 'F', 'C']}
df = pd.DataFrame(data=data)

G = nx.from_pandas_edgelist(df, source='source', create_using=nx.Graph(), target='target')
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, with_labels=False, node_color='#1f0ee3', node_size=150,
                 edge_color='r', width=1, alpha=0.6, style='dashed',
                 font_color='k', font_size=15, font_weight=20)
# Offset for node labels
offset = 0.15
pos_labels = {}
keys = pos.keys()
for key in keys:
    x, y = pos[key]
    pos_labels[key] = (x, y + offset)
nx.draw_networkx_labels(G, pos=pos_labels, fontsize=2)

plt.xlim(-1.25, 1.25)
plt.ylim(-1.25, 1.25)
plt.title('Example')
plt.show()

, который производит Example Network

Что это не показывает, однако , как могут быть соединения между каждым узлом. Например, A-> B на самом деле имеет три ребра. nx.MultiGraph() сделает некоторые ребра более толстыми, чем другие, но на самом деле мне нужно фактическое количество ребер между двумя узлами, отображаемыми на графике. Так что метка для «B» - это «B (3)» (или что-то в этом роде).

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

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Вы можете использовать nx.draw_networkx_edge_labels для маркировки краев. Предоставить словарь с ребрами в качестве ключей и числом ребер в качестве значения:

counts = df.groupby('source')['target'].value_counts().to_dict()
nx.draw_networkx_edge_labels(G, pos, edge_labels=counts)

enter image description here

1 голос
/ 19 февраля 2020

Вы можете настроить свой фрейм данных, чтобы включить номера ребер в строку целевого узла:

data = {'source': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
        'target': ['B', 'B', 'C', 'D', 'E', 'B', 'C', 'E', 'F', 'C']}
df = pd.DataFrame(data=data)

df = df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'edges'})
df['target'] = df['target'] + ' (' + df['edges'].astype(str) + ')'

enter image description here

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