Как добавить легенду в график networkx на основе цвета узла - PullRequest
3 голосов
/ 16 марта 2020

Я впервые использую NetworkX и рисую простую сеть на основе pandas фрейма данных.

Узлы находятся в Nodes_df, который имеет идентификатор и соответствующую группу, где Группа определяет, какого цвета будет узел. Edges_df имеет ребра, которые являются связями между ID и ID_2. Все идентификаторы находятся в Nodes_df.

Я могу нарисовать график и раскрасить узлы на основе словаря, который заменяет строки (то есть «Group1») числом, которое используется аргументом cmap ,

Colour_df = Edges_df.replace({"Group5": 5,"Group4": 4, "Group3": 3, "Group2": 2, "Group1": 1})

Colour_map = dict(zip(Nodes_df["ID"].astype(float), Colour_df["Group"]))

G = nx.from_pandas_edgelist(df=Edges_df, source="ID", target="ID_2",
                            create_using=nx.Graph())

values = [Colour_map.get(node) for node in G.nodes()]

nx.draw(G, cmap=plt.get_cmap('Spectral'), node_color=values,
        node_size=20)

plt.show()

Я использую matplotlib и не могу отобразить легенду на графике. Я попытался передать словарь в аргумент label в nx.draw_networkx_nodes(), но я просто получаю KeyError: 5.

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

[] Group1

[] Group2

[] Group3

[...]

1 Ответ

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

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

фиктивные данные графика

Nodes_df = pd.DataFrame(
    {'ID': range(20),
     'Group': ['Group{}'.format(np.random.randint(1,6)) for a in range(20)]}
)

Edges_df = pd.DataFrame(
    {'ID': np.random.randint(0,20,20),
     'ID_2': np.random.randint(0,20,20)}
)

Edges_df = Edges_df.merge(Nodes_df, how='left', left_on='ID', right_on='ID')

Цвет

# your code
Colour_df = Edges_df.replace({"Group5": 5,"Group4": 4, "Group3": 3, "Group2": 2, "Group1": 1})
Colour_map = dict(zip(Nodes_df["ID"].astype(float), Colour_df["Group"]))
G = nx.from_pandas_edgelist(df=Edges_df, source="ID", target="ID_2",
                            create_using=nx.Graph())
values = [Colour_map.get(node) for node in G.nodes()]

Чертеж

# compute maximum value s.t. all colors can be normalised
maxval = np.max(values) 

# get colormap
cmap=plt.cm.Spectral

# draw graph
nx.draw(G,
        node_color = [cmap(v/maxval) for v in values], # feed normalised group numbers directly into colormap
        node_size=50)

# make empty plot with correct color and label for each group
for v in set(values):
    plt.scatter([],[], c=[cmap(v/maxval)], label='Group{}'.format(v))

plt.legend()
plt.show()

enter image description here

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