Comment modifier la couleur de contour d'un noeud dans networkx?
je suis relativement nouveau à networkx et traquer en utilisant matplotlib.pyplot et voudrait savoir comment modifier la couleur (ou d'autres attributs tels que le poids) du contour d'un noeud. Par "contour" Je ne veux pas dire un arc ou un bord entre deux noeuds; je veux dire la ligne noire mince autour du cercle qui est par défaut utilisé pour représenter un noeud lors de tracer un réseau.
Donc par exemple, quand je fais un graphique qui a un seul nœud et l'afficher:
from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)
je vois un seul noeud rouge avec un mince contour noir (et un "1" noir à l'intérieur, qui est l'étiquette du noeud). Comment puis-je changer la couleur du contour noir à, disons, rouge ("#FF0000"), ou d'une autre couleur? Sinon, puis-je supprimer l'affichage du contour entièrement?
j'imagine qu'il doit y avoir un attribut, analogue à edge_color ou node_color, que je peux définir. Cependant, je n'ai pas pu trouver un tel attribut via une recherche sur le web, dans la documentation de networkx, ou en regardant la galerie exemple. Si quelqu'un peut m'indiquer l'attribut approprié(s) qui serait grandement apprécié. Merci!
4 réponses
Ok, c'est un peu hacky, mais ça marche. Voici ce que j'ai trouvé.
Le Problème
networkx.draw()
appelle networkx.draw_networkx_nodes()
, qui appelle pyplot.scatter()
pour dessiner les nœuds. Le problème est que le mot-clé args accepté par draw_networkx_nodes()
ne sont pas transmis à scatter()
. (source ici)
Pour résoudre ce problème, j'ai ruiné en dehors networkx.draw()
dans ses composants:draw_networkx_nodes
,draw_networkx_edges
et draw_networkx_labels
.
La Solution
On peut prendre la valeur de retour de draw_networkx_nodes()
--PathCollection
-- et agir sur ce qui suit: vous pouvez utiliser PathCollection.set_edgecolor()
ou PathCollection.set_edgecolors()
avec une couleur ou une liste, respectivement.
exemple de code:
from networkx import *
import matplotlib.pyplot as plt
G = Graph()
G.add_node(1)
# Need to specify a layout when calling the draw functions below
# spring_layout is the default layout used within networkx (e.g. by `draw`)
pos = spring_layout(G)
nodes = draw_networkx_nodes(G, pos)
# Set edge color to red
nodes.set_edgecolor('r')
draw_networkx_edges(G, pos)
# Uncomment this if you want your labels
## draw_networkx_labels(G, pos)
plt.show()
Si vous allez utiliser beaucoup cela, il a probablement fait plus de sens (OMI) à redéfinir draw_networkx_nodes
pour passer à la kwargs scatter
. Mais le ci-dessus travail.
pour supprimer entièrement les bordures du marqueur, il suffit de définir la couleur à None
au lieu de 'r'
.
Depuis NetworkX 2.1, il y a un edgecolors
argument ajouté à draw_networkx_nodes()
(et draw()
puisqu'il appelle finalement draw_networkx_nodes()
pour dessiner des noeuds).
Si vous voulez changer la couleur des nœuds' contour, vous pouvez simplement faire:
draw(G, linewidths=2)
ax = plt.gca() # to get the current axis
ax.collections[0].set_edgecolor("#FF0000")
Et c'est tout.
ax.collections[0]
est unPathCollection
objet régissant le les nœudsax.collections[1]
est unLineCollection
objet régissant le bords si vous avez quelques.
vous pouvez modifier beaucoup d'autres propriétés rapidement avec une collection donnée.
je sais que c'est un fil antient, mais je cherchais cette réponse aussi, et j'ai finalement trouvé la façon native non-hacky. Vous pouvez passer l'argument largeur=0 dans la fonction draw. Je pense que cela affecte seulement la largeur des bordures du noeud plutôt que la largeur du bord (qui est contrôlée par la largeur=x).