Networkx: поднимая метки над узлом, используя позицию - PullRequest
0 голосов
/ 03 марта 2020

Я очень плохо знаком с networkx (только сегодня!): Я использую эти две ссылки и репликацию:

Это для создания сети

и Это то, как я пытался отрегулировать положение меток

Так что мое выглядит так:

layout = nx.spring_layout(g,k=0.2,iterations=50)
for l in layout:  # raise text positions
    layout[l][1] += 0.5

Я настроил 0,5 на меньшие и даже большие значения, но ничего не происходит, никаких настроек. Без изменений вообще. Что я делаю не так?

Совокупность двух кодов выглядит следующим образом:

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

plt.figure(figsize=(12, 12))

df = pd.read_csv(df_path)

# 1. Create the graph
g = nx.from_pandas_edgelist(df, source='name', target='club') 
# 2. Create a layout for our nodes 
layout = nx.spring_layout(g,k=0.2,iterations=50)
for l in layout:  # raise text positions
    layout[l][1] += 0.5
# 3. Draw the parts we want
nx.draw_networkx_edges(g, layout, edge_color='#AAAAAA')

clubs = [node for node in g.nodes() if node in df.club.unique()]
size = [g.degree(node) * 80 for node in g.nodes() if node in df.club.unique()]
nx.draw_networkx_nodes(g, layout, nodelist=clubs, node_size=size, node_color='lightblue')

people = [node for node in g.nodes() if node in df.name.unique()]
nx.draw_networkx_nodes(g, layout, nodelist=people, node_size=100, node_color='#AAAAAA')

high_degree_people = [node for node in g.nodes() if node in df.name.unique() and g.degree(node) > 1]
nx.draw_networkx_nodes(g, layout, nodelist=high_degree_people, node_size=100, node_color='#fc8d62')

club_dict = dict(zip(clubs, clubs))
nx.draw_networkx_labels(g, layout, labels=club_dict)

# 4. Turn off the axis because I know you don't want it
plt.axis('off')

plt.title("Revolutionary Clubs")

Заранее большое спасибо !!

и на боковой ноте кто-нибудь делает есть отличный учебник по networkx? Я гуглил и не нашел много. И если вам известны учебные пособия по сети x, в которых показано, как создавать интерактивные сети, это было бы еще лучше!

1 Ответ

1 голос
/ 03 марта 2020

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

Ваш код просто перемещает все, то есть метки и ребра по оси Y. Я исправил положение корректировки в вашем коде:

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

plt.figure(figsize=(12, 12))

df = pd.read_csv(df_path)

# 1. Create the graph
g = nx.from_pandas_edgelist(df, source='name', target='club') 
# 2. Create a layout for our nodes 
layout = nx.spring_layout(g,k=0.2,iterations=50)
#
# ----- removed correction
#

# 3. Draw the parts we want
nx.draw_networkx_edges(g, layout, edge_color='#AAAAAA')

clubs = [node for node in g.nodes() if node in df.club.unique()]
size = [g.degree(node) * 80 for node in g.nodes() if node in df.club.unique()]
nx.draw_networkx_nodes(g, layout, nodelist=clubs, node_size=size, node_color='lightblue')

people = [node for node in g.nodes() if node in df.name.unique()]
nx.draw_networkx_nodes(g, layout, nodelist=people, node_size=100, node_color='#AAAAAA')

high_degree_people = [node for node in g.nodes() if node in df.name.unique() and g.degree(node) > 1]
nx.draw_networkx_nodes(g, layout, nodelist=high_degree_people, node_size=100, node_color='#fc8d62')

club_dict = dict(zip(clubs, clubs))

# ------> and move it here
for l in layout:  # raise text positions
    layout[l][1] += 0.1  # probably small value enough
nx.draw_networkx_labels(g, layout, labels=club_dict)

# 4. Turn off the axis because I know you don't want it
plt.axis('off')

plt.title("Revolutionary Clubs")
...