Проблемы с визуализацией больших сетей в Networkx - PullRequest
2 голосов
/ 06 июня 2019

У меня есть большой фрейм данных Python, из которого я пытаюсь построить сеть.У меня есть source_node (около 10 уникальных значений) и target_node (с тысячами значений).Я смотрю на исходящие взаимодействия, например source_node_1 на несколько целевых узлов.В настоящее время моя визуализация сети не является идеальной, если не сказать больше.

Вот как выглядит результат:

what the result looks like

Этот код используется для создания сети:

df = pd.DataFrame({
    'source_node':['sc1','sc2','sc2'],
    'target_node':['tg1,tg2,tg3','tg10','tg2,sc1']
}) 
df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))

G = nx.DiGraph()

for r in df.iterrows():
    for user in r[1]['splitted_targets']:
        G.add_edge(r[1]['source_node'], user)

nx.draw(G, with_labels=True)

Существует ли простой способ, например, создать 10 графиков для каждого уникального source_node и его target_nodes или создать упрощенный график, который можетчитать?

1 Ответ

1 голос
/ 06 июня 2019

Логично, что такой огромный график выглядит как ужасный беспорядок.На мониторе FullHD с 5000 узлами для каждого узла будет не более:

sqrt(1920 * 1080 / 5000) = 20

Изображение размером 20x20 пикселей для узла, текстовой метки и всех возможных ребер.Более того, человеческий мозг очень плохо манипулирует этим количеством данных , поэтому, даже если кто-то нарисует огромный график, он не сможет правильно его проанализировать.

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

G.remove_nodes_from([
    n
    for n in G.nodes
    if n not in df['source_node']
    if G.degree(n) < 2
])

Таким образом, окончательный код будет:

df = pd.DataFrame({
'source_node':['sc1','sc2','sc3'],
'target_node':['tg1,tg2,tg3,sc2','tg10,tg2,sc3','tg2,sc1'] }) 

df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))

G = nx.DiGraph()
for r in df.iterrows():
    for user in r[1]['splitted_targets']:
        G.add_edge(r[1]['source_node'], user)
print(list(list(G.neighbors(n)) for n in G.nodes))
G.remove_nodes_from([
    n
    for n in G.nodes
    if n not in df['source_node']
    if G.degree(n) < 2
])
nx.draw(G, with_labels=True)

И этот график:

enter image description here

Будет уменьшено до:

enter image description here

Я уверен, что в вашем случае это очень поможет, потому что у вас естьтолько несколько десятков исходных узлов.Вы также можете играть с размерами узлов, метками узлов, шрифтами и т. Д.

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