Saltar al contenido

¿Cómo se puede modificar el color del contorno de un nodo en networkx?

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_edgesy 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 un PathCollection objeto que rige el nodos
  • ax.collections[1] es un LineCollection 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *