关于python:如何在networkx中修改节点的轮廓颜色?

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

我对networkx和使用matplotlib.pyplot进行绘制相对较新,并且想知道如何修改节点轮廓的颜色(或其他属性,例如权重)。"轮廓"并不是指两个节点之间的弧线或边缘;我的意思是,在绘制网络时,圆周围的细黑线默认用于表示节点。

因此,例如,当我制作一个只有一个节点的图并显示它时:

1
2
3
4
5
6
from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)

我看到了一个红色的节点,它的轮廓很细(黑色)(里面是黑色的" 1",这是节点的标签)。如何将轮廓的颜色从黑色更改为红色("#FF0000")或其他颜色?另外,是否可以完全取消显示轮廓?

我在想必须有一个我可以设置的类似于edge_color或node_color的属性。但是,我无法通过网络搜索,networkx文档中或查看图库示例来找到此类属性。如果有人可以将我指向适当的属性,将不胜感激。谢谢!


更新(3/2019):从networkx 2.1开始,kwargs从draw()转发,因此您应该能够简单地使用edge_color kwarg调用draw()

好的,这有点hacky,但是可以用。这是我想出的。

问题

networkx.draw()调用networkx.draw_networkx_nodes(),然后调用pyplot.scatter()绘制节点。问题是draw_networkx_nodes()接受的关键字args不会传递给scatter()。 (在这里获取资料)

为了解决这个问题,我基本上将networkx.draw()分解为其组件:draw_networkx_nodesdraw_networkx_edgesdraw_networkx_labels

解决方案

我们可以使用draw_networkx_nodes()的返回值(PathCollection)并对其进行操作:您可以分别将PathCollection.set_edgecolor()PathCollection.set_edgecolors()与颜色或列表一起使用。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

如果您将经常使用它,则重新定义draw_networkx_nodes实际将kwarg传递给scatter可能更有意义(IMO)。但是上面的工作。

要完全去除标记边缘,只需将颜色设置为None而不是'r'


从NetworkX 2.1开始,在draw_networkx_nodes()中添加了edgecolors参数(以及draw(),因为它最终调用draw_networkx_nodes()来绘制节点)。


如果要更改节点轮廓的颜色,可以执行以下操作:

1
2
3
draw(G, linewidths=2)
ax = plt.gca() # to get the current axis
ax.collections[0].set_edgecolor("#FF0000")

就是这样。

  • ax.collections[0]是管理节点的PathCollection对象
  • ax.collections[1]是控制边缘的LineCollection对象(如果有)。

您可以使用给定的集合快速修改许多其他属性。


我知道这是一个antient线程,但是我也在寻找这个答案,最终找到了本机的非hacky方式。您可以将参数linewidths = 0传递给draw函数。我认为这仅影响节点边界的宽度,而不影响边缘宽度(由width = x控制)。