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!

15
demandé sur user1071516 2014-03-28 18:51:10

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

15
répondu surfreak 2014-07-09 13:38:09

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

4
répondu Marc 2018-04-25 07:10:02

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 un PathCollection objet régissant le les nœuds
  • ax.collections[1] est un LineCollection objet régissant le bords si vous avez quelques.

vous pouvez modifier beaucoup d'autres propriétés rapidement avec une collection donnée.

3
répondu jrjc 2017-03-27 15:40:40

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

2
répondu user1786476 2016-12-08 21:12:31