python - change - ¿Cómo se puede modificar el color de contorno de un nodo en networkx?
networkx python change node color (4)
Desde NetworkX 2.1 , se ha edgecolors
un argumento edgecolors
a draw_networkx_nodes()
(así como a draw()
ya que en última instancia llama a draw_networkx_nodes()
para dibujar nodos).
Soy relativamente nuevo en networkx y graficando con matplotlib.pyplot y me gustaría saber cómo modificar el color (u otros atributos como el peso) del contorno de un nodo. Por "contorno" no me refiero a un arco o borde entre dos nodos; Me refiero a la línea negra delgada alrededor del círculo que se usa de forma predeterminada para representar un nodo al trazar una red.
Entonces, por ejemplo, cuando hago un gráfico que tiene un solo nodo y lo visualizo:
from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)
Veo un solo nodo rojo con un contorno negro fino (y un "1" negro en su interior, que es la etiqueta del nodo). ¿Cómo puedo cambiar el color de ese contorno de negro a, digamos, rojo ("# FF0000") u otro color? Alternativamente, ¿puedo suprimir la visualización del contorno por completo?
Estoy imaginando que debe haber un atributo, análogo a edge_color o node_color, que puedo establecer. Sin embargo, no pude encontrar dicho atributo a través de una búsqueda en la Web, en la documentación de networkx, o mirando ejemplos de la galería. Si alguien me puede indicar los atributos apropiados, eso sería muy apreciado. ¡Gracias!
Sé que este es un hilo antient, pero también estaba buscando esta respuesta, y finalmente encontré la forma no hacky nativa. Puede pasar el argumento linewidths = 0 a la función de dibujo. Creo que esto solo afecta el ancho de los bordes del nodo en lugar del ancho del borde (que se controla con el ancho = x).
Si desea cambiar el color del contorno de los nodos, puede hacerlo:
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 objetoPathCollection
que rige los nodos -
ax.collections[1]
es un objetoLineCollection
que rige los bordes, si tiene alguno.
Puede modificar muchas otras propiedades rápidamente con una colección determinada.
ACTUALIZACIÓN (3/2019) : a partir de networkx 2.1, los kwargs se reenvían desde draw()
, por lo que debería poder llamar simplemente draw()
con el edge_color
kwarg.
Ok, esto es una especie de hacky, pero funciona. Esto es lo que se me ocurrió.
El problema
networkx.draw()
llama a networkx.draw_networkx_nodes()
, que luego llama a pyplot.scatter()
para dibujar los nodos. El problema es que la palabra clave args aceptada por draw_networkx_nodes()
no se pasa a scatter()
. ( fuente aquí )
Para resolver esto, básicamente 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 utilizarlo: puede 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 (IMO) simplemente redefinir draw_networkx_nodes
para pasar los kwargs a scatter
. Pero lo anterior funcionará.
Para eliminar por completo los bordes del marcador, simplemente configure el color en None
lugar de ''r''
.