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

use*_*516 16 python attributes matplotlib nodes networkx

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

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

from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)
Run Code Online (Sandbox Code Playgroud)

我看到一个红色的节点,黑色轮廓很薄(里面有一个黑色的"1",这是节点的标签).如何将轮廓的颜色从黑色更改为红色("#FF0000")或其他颜色?或者,我可以完全抑制轮廓的显示吗?

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

sur*_*eak 20

好吧,这有点hacky,但它确实有效.这就是我想出来的.

问题

draw()调用draw(),然后调用edge_color绘制节点.问题是接受的关键字args networkx.draw()没有传递给networkx.draw_networkx_nodes().(来源)


为了解决这个问题,我基本上解体pyplot.scatter()成它的组分:draw_networkx_nodes(),scatter(),和networkx.draw().

解决方案

我们可以获取draw_networkx_nodes- a draw_networkx_edges- 的返回值并对其进行操作:您可以分别使用draw_networkx_labelsdraw_networkx_nodes()使用颜色或列表.

示例代码:

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()
Run Code Online (Sandbox Code Playgroud)

如果你将要使用它很多,那么重新定义PathCollection实际传递kwargs 可能更有意义(IMO)PathCollection.set_edgecolor().但上述情况奏效.

要完全删除标记边缘,只需将颜色设置为PathCollection.set_edgecolors()而不是draw_networkx_nodes.

  • 我认为对这个答案的更新是错误的。`draw()` 中的 `edge_color` 参数设置边 = 图中链接的颜色,而不是节点的边 (3认同)
  • 有没有人看到为什么不应该传递kwargs**的原因?如果没有,我会提交错误报告. (2认同)
  • @surfreak,在 2.2 中还有用于 `draw_networkx_nodes()` 的 karg `edgecolors`。 (2认同)

Mar*_*arc 9

NetworkX 2.1开始,edgecolors添加了一个参数draw_networkx_nodes()(以及draw()最终调用draw_networkx_nodes()绘制节点).


jrj*_*rjc 6

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

draw(G, linewidths=2)
ax = plt.gca() # to get the current axis
ax.collections[0].set_edgecolor("#FF0000") 
Run Code Online (Sandbox Code Playgroud)

就是这样.

  • ax.collections[0]PathCollection管理节点的对象
  • ax.collections[1]是一个LineCollection控制边缘的对象,如果你有一些.

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