web-dev-qa-db-fra.com

comment dessiner des graphes dirigés en utilisant networkx en python?

J'ai des nœuds provenant d'un script que je veux mapper sur un graphique. Dans la liste ci-dessous, je souhaite utiliser Arrow pour aller de A à D et probablement que Edge soit coloré (Rouge ou autre). En gros, cela ressemble à un chemin de A à D lorsque tous les autres nœuds sont présents. vous pouvez imaginer que chaque nœud est une ville et que vous voyagiez de A à D, vous devez vous y rendre (avec des flèches) Ce code ci-dessous construit le graphique

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values)
plt.show()

mais je veux quelque chose comme montré dans l'image.enter image description hereenter image description here

Les pointes de flèche de la première image et les bords en rouge sur la deuxième image ..Merci

84
brain storm

Exemple entièrement étoffé avec des flèches pour les bords rouges uniquement:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

# Specify the edges you want here
red_edges = [('A', 'C'), ('E', 'C')]
Edge_colours = ['black' if not Edge in red_edges else 'red'
                for Edge in G.edges()]
black_edges = [Edge for Edge in G.edges() if Edge not in red_edges]

# Need to create a layout when doing
# separate calls to draw nodes and edges
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), 
                       node_color = values, node_size = 500)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, edgelist=red_edges, Edge_color='r', arrows=True)
nx.draw_networkx_edges(G, pos, edgelist=black_edges, arrows=False)
plt.show()

Red edges

71
Marius

Je ne mets cela que pour être complet. J'ai beaucoup appris de marius et de mdml. Voici les poids Edge. Désolé pour les flèches. On dirait que je ne suis pas le seul à dire qu'on ne peut rien y faire. Je ne pouvais pas rendre ceci avec le cahier ipython, je devais passer directement de python, ce qui posait le problème de l'obtention de mes poids Edge plus tôt.

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pylab

G = nx.DiGraph()

G.add_edges_from([('A', 'B'),('C','D'),('G','D')], weight=1)
G.add_edges_from([('D','A'),('D','E'),('B','D'),('D','E')], weight=2)
G.add_edges_from([('B','C'),('E','F')], weight=3)
G.add_edges_from([('C','F')], weight=4)


val_map = {'A': 1.0,
                   'D': 0.5714285714285714,
                              'H': 0.0}

values = [val_map.get(node, 0.45) for node in G.nodes()]
Edge_labels=dict([((u,v,),d['weight'])
                 for u,v,d in G.edges(data=True)])
red_edges = [('C','D'),('D','A')]
Edge_colors = ['black' if not Edge in red_edges else 'red' for Edge in G.edges()]

pos=nx.spring_layout(G)
nx.draw_networkx_Edge_labels(G,pos,Edge_labels=Edge_labels)
nx.draw(G,pos, node_color = values, node_size=1500,Edge_color=Edge_colors,Edge_cmap=plt.cm.Reds)
pylab.show()

enter image description here

42
Back2Basics

Au lieu de nx.draw, vous voudrez peut-être utiliser:

nx.draw_networkx(G[, pos, arrows, with_labels])

Par exemple:

nx.draw_networkx(G, arrows=True, **options)

Vous pouvez ajouter des options en initialisant cette ** variable comme ceci:

options = {
    'node_color': 'blue',
    'node_size': 100,
    'width': 3,
    'arrowstyle': '-|>',
    'arrowsize': 12,
}

De plus, certaines fonctions supportent le directed=True parameter _ Dans ce cas, il s'agit de l'état par défaut:

G = nx.DiGraph(directed=True)

La référence networkx est trouvée ici .

Graph with arrows image

18
Raz

Vous devez utiliser un graphe orienté au lieu d’un graphe, c.-à-d.

G = nx.DiGraph()

Créez ensuite une liste des couleurs Edge que vous souhaitez utiliser et transmettez-les à nx.draw (comme le montre @Marius).

En réunissant tout cela, je reçois l'image ci-dessous. Toujours pas tout à fait l’autre image que vous montrez (je ne sais pas d’où viennent vos poids Edge), mais beaucoup plus proche! Si vous souhaitez mieux contrôler l'apparence de votre graphique de sortie (par exemple, obtenir des pointes de flèches qui ressemblent à des flèches), veuillez vérifier NetworkX avec Graphviz .

enter image description here

18
mdml
import networkx as nx
import matplotlib.pyplot as plt

g = nx.DiGraph()
g.add_nodes_from([1,2,3,4,5])
g.add_Edge(1,2)
g.add_Edge(4,2)
g.add_Edge(3,5)
g.add_Edge(2,3)
g.add_Edge(5,4)

nx.draw(g,with_labels=True)
plt.draw()
plt.show()

C’est simplement comment faire pour dessiner un graphe dirigé en utilisant python 3.x en utilisant networkx. juste une simple représentation et peut être modifié et coloré etc. Voir le graphe généré ici .

Note: C'est juste une simple représentation. Des arêtes pondérées pourraient être ajoutées comme

g.add_edges_from([(1,2),(2,5)], weight=2)

et donc tracé à nouveau.

5