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.
Les pointes de flèche de la première image et les bords en rouge sur la deuxième image ..Merci
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()
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()
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 .
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 .
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.