este problema se puede resolver de variadas maneras, pero en este caso te mostramos la que para nosotros es la solución más completa.
Solución:
ACTUALIZACIÓN (3/2019): a partir de networkx 2.1, los kwargs se reenvían desde draw()
por lo que debería poder simplemente llamar draw()
con el edge_color
kwarg
Ok, esto es un poco hacky, pero funciona. Esto es lo que se me ocurrió.
El problema
networkx.draw()
llamadas networkx.draw_networkx_nodes()
que luego llama pyplot.scatter()
para dibujar los nodos. El problema es que la palabra clave args aceptada por draw_networkx_nodes()
no se transmiten a scatter()
. (fuente aquí)
Para resolver esto, básicamente me separé networkx.draw()
en sus componentes: draw_networkx_nodes
, draw_networkx_edges
y draw_networkx_labels
.
La solución
Podemos tomar el valor de retorno de draw_networkx_nodes()
— un PathCollection
— y operar con eso: puedes usar PathCollection.set_edgecolor()
o PathCollection.set_edgecolors()
con un color o una lista, respectivamente.
Código de ejemplo:
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 va a usar esto mucho, probablemente tenga más sentido (OMI) simplemente redefinir draw_networkx_nodes
para realmente pasar los kwargs a scatter
. pero lo de arriba será trabaja.
Para eliminar los bordes del marcador por completo, simplemente establezca el color en None
en vez de 'r'
.
Desde NetworkX 2.1, existe una edgecolors
argumento añadido a draw_networkx_nodes()
(así como para draw()
ya que finalmente llama draw_networkx_nodes()
para dibujar nodos).
Si desea cambiar el color del contorno de los nodos, puede hacer lo siguiente:
draw(G, linewidths=2)
ax = plt.gca() # to get the current axis
ax.collections[0].set_edgecolor("#FF0000")
Y eso es.
ax.collections[0]
es unPathCollection
objeto que rige el nodosax.collections[1]
es unLineCollection
objeto que rige el bordes si tienes alguno
Puede modificar muchas otras propiedades rápidamente con una colección dada.
Reseñas y valoraciones del artículo
Al final de la web puedes encontrar las crónicas de otros administradores, tú aún tienes la libertad de dejar el tuyo si te gusta.