#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
@RAbeeq3. уже сделал и выбираю (принимаю этот ответ) спасибо <3
4.
labels = nx.get_edge_attributes(G, 'label')
, это в коде @RAbeeq5. Нет, я просто использовал это для анализа вашего фрейма данных выше, который является строкой. Но используйте
pd.read_csv
или какой-то эквивалент, в зависимости от источника. Вы найдете множество сообщений о том, как считывать данные в фрейм данных pandas @RAbeeq