Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can one modify the outline color of a node In networkx?

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!

like image 838
user1071516 Avatar asked Mar 28 '14 14:03

user1071516


People also ask

What is Nbunch in NetworkX?

nbunch. An nbunch is a single node, container of nodes or None (representing all nodes). It can be a list, set, graph, etc..

Which data type can be used as the content of a node in NetworkX?

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.


3 Answers

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

like image 166
surfreak Avatar answered Sep 18 '22 19:09

surfreak


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

like image 43
Marc Avatar answered Sep 18 '22 19:09

Marc


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.

like image 30
jrjc Avatar answered Sep 19 '22 19:09

jrjc