Frage

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!

War es hilfreich?

Lösung

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

Andere Tipps

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.

I know this is an antient thread, but I was looking for this answer too, and finally found the native non-hacky way. You can pass the argument linewidths=0 into the draw function. I think this only affects the width of the node borders rather than the edge width (which is controled by width=x).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top