如何修改networkx中节点的轮廓颜色?

2024-03-29 10:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,当我创建一个只有一个节点的图并显示它时:

from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)

我看到一个红色的节点,有一个很薄的黑色轮廓(其中有一个黑色的“1”,这是节点的标签)。如何将轮廓的颜色从黑色改为红色(“FF0000”)或其他颜色?或者,我可以完全抑制大纲的显示吗?

我想一定有一个属性,类似于边色或节点色,我可以设置。但是,我无法通过web搜索、networkx文档或通过查看库示例来找到这样的属性。如果有人能给我指一个合适的属性,我将不胜感激。谢谢!


Tags: importnetworkx绘图属性节点matplotlib颜色plt
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对象,控制边(如果有)。

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

NetworkX 2.1以来,有一个edgecolors参数添加到^{}(以及^{},因为它最终调用draw_networkx_nodes()来绘制节点)。

更新(3/2019)as of networkx 2.1, the kwargs are forwarded来自draw(),因此您应该能够简单地用edge_colorkwarg调用draw()

好吧,这有点老套,但很管用。这是我想到的。

问题

networkx.draw()调用networkx.draw_networkx_nodes(),然后调用pyplot.scatter()来绘制节点。问题是,draw_networkx_nodes()接受的关键字参数没有传递给scatter()。(source here


为了解决这个问题,我基本上把networkx.draw()分解成它的组成部分:draw_networkx_nodesdraw_networkx_edges,和draw_networkx_labels

解决方案

我们可以获取draw_networkx_nodes()——aPathCollection的返回值并对其进行操作:您可以分别对颜色或列表使用PathCollection.set_edgecolor()PathCollection.set_edgecolors()

示例代码:

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

如果您要经常使用它,那么(IMO)重新定义draw_networkx_nodes以实际将kwargs传递给scatter可能更有意义。但上面的起作用。

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

相关问题 更多 >