Networkx-Farbe basierend auf Label-Clustering

Sep 04 2020

Ich habe Link-Basisdaten, für die ich ein Cluster-Label erstellt habe, und die Daten sehen folgendermaßen aus: Die ID_1 und ID_2 sind miteinander verknüpft, und das Label ist die Clusternummer für jeden Link.

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..

und ich benutze networkxBibliothek, um die Linie zwischen ihnen grafisch darzustellen.

Gibt es eine Möglichkeit, die Datenknoten basierend auf der Clusterbezeichnung wie in der seabornBibliothek einzufärben?

Antworten

1 yatu Sep 04 2020 at 14:09

nx.drawEs gibt viele Argumente, mit denen Sie das generierte Diagramm anpassen können. In diesem Fall möchten Sie eine festlegen edge_color, die vom labelAttribut abhängt . Ich habe das hier labelsein wenig modifiziert , um den Punkt besser zu veranschaulichen.

Um Ihr Beispiel zu reproduzieren, habe ich das Diagramm aus der Kantenliste als Pandas-Datenrahmen generiert, was es sehr einfach macht. Da ich festgelegt habe edge_attr=True, labelwird das ein Attribut sein. Wir können es also als Wörterbuch mit speichern nx.get_edge_attributes.

Dann können wir die Kantenfarbe edge_color=list(labels.values())mit einer cmapAuswahl festlegen und das Diagramm wie folgt darstellen:

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)


Einrichten -

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=',')