I am relatively new to networkx and plotting using matplotlib.pyplot and would like to know how to modify the color (or other attributes such as weight) of a node's outline. By "outline" I don't mean an arc or edge between two nodes; I mean the thin black line around the circle that is by default used to represent a node when plotting a network.
So for example, when I make a graph that has just a single node and display it:
from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)
I see a single red node with a thin black outline (and a black "1" inside it, which is the node's label). How can I change the color of that outline from black to, say, red ("#FF0000"), or another color? Alternatively, can I suppress the display of the outline entirely?
I'm imagining there must be an attribute, analogous to edge_color or node_color, that I can set. However, I was not able to find such an attribute via a web search, in the networkx documentation, or by looking at gallery examples. If someone can point me to the appropriate attribute(s) that would be greatly appreciated. Thanks!
nbunch. An nbunch is a single node, container of nodes or None (representing all nodes). It can be a list, set, graph, etc..
In NetworkX, nodes can be any hashable object e.g., a text string, an image, an XML object, another Graph, a customized node object, etc. Python's None object is not allowed to be used as a node.
UPDATE (3/2019): as of networkx 2.1, the kwargs are forwarded from draw()
, so you should be able to simply call draw()
with the edge_color
kwarg.
Ok, this is kind of hacky, but it works. Here's what I came up with.
The Problem
networkx.draw()
calls networkx.draw_networkx_nodes()
, which then calls pyplot.scatter()
to draw the nodes. The problem is that the keyword args accepted by draw_networkx_nodes()
aren't passed on to scatter()
. (source here)
To solve this, I basically broke apart networkx.draw()
into its components: draw_networkx_nodes
, draw_networkx_edges
, and draw_networkx_labels
.
The Solution
We can take the return value of draw_networkx_nodes()
-- a PathCollection
-- and operate on that: you can use PathCollection.set_edgecolor()
or PathCollection.set_edgecolors()
with either a color or a list, respectively.
Example 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()
If you're going to be using this a lot, it probably makes more sense (IMO) to just redefine draw_networkx_nodes
to actually pass the kwargs to scatter
. But the above will work.
To remove the marker edges entirely, simply set the color to None
instead of 'r'
.
Since NetworkX 2.1, there's an edgecolors
argument added to draw_networkx_nodes()
(as well as to draw()
since it ultimately calls draw_networkx_nodes()
to draw nodes).
If you want to change the color of the nodes' outline, you can just do:
draw(G, linewidths=2)
ax = plt.gca() # to get the current axis
ax.collections[0].set_edgecolor("#FF0000")
And that's it.
ax.collections[0]
is a PathCollection
object governing the nodes
ax.collections[1]
is a LineCollection
object governing the edges if you have some.You can modify many other properties rapidly with a given collection.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With