基于根节点深度的节点着色

Coloring of nodes based on depth from root node

我使用 networkx

在 python 上绘制了一张图表
o = net.DiGraph()
hfollowers = defaultdict(lambda: 0)
for (twitter_user, followed_by, followers) in twitter_network:
    o.add_edge(twitter_user, followed_by, followers=int(followers))hfollowers[twitter_user] = int(followers)

我定义了一个 root - 这是 twitter 用户的名字

SEED = 'BarackObama'

我已经从 SEED 初始化了一个子图

g = net.DiGraph(net.ego_graph(o, SEED, radius=4))

现在,我想根据 SEED 的深度为节点分配颜色并绘制它。我该怎么做?

在下面的代码中,我创建了一个图表。然后我从该图中得到每个节点的距离。然后我将其反转,这样对于每个距离我都有一个该距离处的节点列表。然后对于每个距离,我绘制具有给定颜色的节点。请注意,如果存在无法访问的节点,则不会绘制它。如果存在这样的节点,您需要单独决定要对它们做什么。

另外因为我只使用标准颜色(白色除外),所以我只能做几个距离。如果您需要更多,那么您将不得不使用其他方式来制作您的颜色列表(或者制作一个 returns 基于距离的颜色的函数)。它将采用 RGB 或 HEX 定义的颜色。

G=nx.erdos_renyi_graph(10,0.4)
G.add_node(11) # here's a new node, it's not connected


SEED=1
distanceDict = nx.shortest_path_length(G, SEED) #for each node know how far it is
inverse_dict = {} #for each distance this will say which nodes are there.
for k,v in distanceDict.iteritems():
    inverse_dict[v] = inverse_dict.get(v,[])
    inverse_dict[v].append(k)
inverse_dict
> {0: [1], 1: [0, 5, 6], 2: [2, 3, 4, 8, 9], 3: [7]}
colors = ['r', 'b', 'g', 'k', 'c', 'm']#create a list of colors

pos = nx.spring_layout(G) #set positions so that each plot below uses same position
for distance in inverse_dict.keys():
    if distance<=len(colors): #plot these nodes with the right color
        nx.draw_networkx(G, pos = pos, nodelist = inverse_dict[distance], node_color = colors[distance])


tooFar = []
for node in G.nodes_iter():
    if node not in distanceDict or distanceDict[node]>max_dist:
        tooFar.append(node)
nx.draw_networkx(G,pos=pos, nodelist=tooFar, node_color='w')

plt.show()