networkx:在draw_circular中更改节点颜色

1 投票
2 回答
10566 浏览
提问于 2025-04-17 06:03

我用networkx和draw_circular画了一个图。

  networkx.draw_circular(g)

我想改变一些节点的颜色,可能可以用 draw_networkx_nodes 来实现。
但是为了做到这一点,我需要知道节点的位置,我该如何获取draw_circular中节点的位置呢?
或者直接说,我该如何在draw_circular中改变一些节点的颜色呢?

2 个回答

2

补充一下之前的回答(Avaris),使用 "networkx.draw_networkx_nodes()" 这个函数里的 "nodelist" 属性也可能会很有用。

import matplotlib.pyplot as plt
import networkx as nx

nodes = [0,1,2,3]
edges = [(0,1), (1,2), (3,1), (2,3)]
nodeListA = [0,1]
nodeListB = [2,3]    

G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
position = nx.circular_layout(G)

nx.draw_networkx_nodes(G,position, nodelist=nodeListA, node_color="b")
nx.draw_networkx_nodes(G,position, nodelist=nodeListB, node_color="r")

nx.draw_networkx_edges(G,position)
nx.draw_networkx_labels(G,position)

plt.show()

这会生成下面这个图:

enter image description here

你还可以从 "position" 这个变量中获取节点的位置。输出的结果大概是这样的:

In [119]: position
Out[119]: 
{0: array([ 1. ,  0.5], dtype=float32),
 1: array([ 0.49999997,  1.        ], dtype=float32),
 2: array([ 0.        ,  0.49999997], dtype=float32),
 3: array([ 0.5,  0. ], dtype=float32)}
7

draw_circular 这个函数可以接受和 draw_networkx 一样的参数。它有一个可选的参数 node_color,你可以用它来为每个节点指定颜色。传给 node_color 的参数必须是一个列表,列表的长度要和节点的数量相等,或者你也可以传一个单一的颜色值,这样所有节点都会用这个颜色。颜色可以是任何 matplotlib 识别的颜色。

比如,像下面这样设置就能得到下面的效果:

import networkx as nx
import matplotlib.pyplot as plt
from random import random
g = nx.random_graphs.erdos_renyi_graph(10,0.5)
colors = [(random(), random(), random()) for _i in range(10)]
nx.draw_circular(g, node_color=colors)
plt.show()

enter image description here

编辑

另外,你还可以使用 networkx.layout.circular_layout 等函数来获取节点在特定布局中的位置。

撰写回答