цвет networkx на основе кластеризации меток

#python #networkx

#python #networkx

Вопрос:

У меня есть базовые данные ссылки, которые я кластеризовал для каждой из них, и данные выглядят следующим образом: id_1 и id_2 связаны друг с другом, а метка — это номер кластера для каждой ссылки.

 id_1,id_2,label
0,18427,1
1,21708,1
1,22208,1
1,22171,1
1,6829,1
1,16590,1
1,20135,1
1,8894,1
1,15785,1
1,10281,1
etc..
  

и я использую networkx библиотеку для построения графика линии между ними.

Есть ли способ раскрасить узлы данных на основе метки кластера, как мы делаем в seaborn библиотеке?

Ответ №1:

nx.draw содержит множество аргументов, которые позволяют настраивать сгенерированный график. В этом случае вы хотите установить значение, edge_color которое зависит от label атрибута. Я немного изменил labels здесь, чтобы лучше проиллюстрировать суть.

Чтобы воспроизвести ваш пример, я сгенерировал график из списка edgelist в виде фрейма данных pandas, что делает его очень простым. Поскольку я установил edge_attr=True , label это будет атрибут. Таким образом, мы можем сохранить его как словарь с помощью nx.get_edge_attributes .

Затем мы можем задать цвет края, используя edge_color=list(labels.values()) с cmap выбором, и построить график следующим образом:

 import matplotlib.cm as cm
from matplotlib import pyplot as plt

G = nx.from_pandas_edgelist(df, source='id_1', target='id_2', edge_attr=True)
cmap = cm.get_cmap('viridis', max(labels.values()))
labels = nx.get_edge_attributes(G, 'label')

plt.figure(figsize=(8,6))
nx.draw(G, with_labels=True, 
        edgelist=list(labels.keys()), 
        edge_color=list(labels.values()),
        edge_cmap= plt.cm.summer, 
        node_color='lightgreen', 
        node_size=1000, width=2)
  

введите описание изображения здесь


Настройка —

 s = StringIO('''
id_1,id_2,label
0,18427,1
1,21708,1
1,22208,3
1,22171,4
1,6829,1
1,16590,2
1,20135,3
1,8894,2
1,15785,2
1,10281,2
''')
df = pd.read_csv(s, delim_whitespace=False, sep=',')
  

Комментарии:

1. это работает нормально, спасибо: D но есть ли способ раскрасить ссылку и узел, а не только ссылку?

2. Да, вместо того, чтобы устанавливать node_color=somecolor , установите его на list(labels.values()) , например edge_color @RAbeeq

3. уже сделал и выбираю (принимаю этот ответ) спасибо <3

4. labels = nx.get_edge_attributes(G, 'label') , это в коде @RAbeeq

5. Нет, я просто использовал это для анализа вашего фрейма данных выше, который является строкой. Но используйте pd.read_csv или какой-то эквивалент, в зависимости от источника. Вы найдете множество сообщений о том, как считывать данные в фрейм данных pandas @RAbeeq