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

时间:2015-02-25 20:33:41

标签: python python-2.7 networkx

我在使用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的深度为节点指定颜色并绘制它。我该怎么做?

1 个答案:

答案 0 :(得分:0)

在下面的代码中,我创建了一个图表。然后我从该图中获得每个节点的距离。然后我将其反转,以便相反,对于每个距离,我在该距离处有一个节点列表。然后,对于每个距离,我绘制具有给定颜色的节点。请注意,如果存在无法访问的节点,则不会对其进行绘制。如果存在这样的节点,您需要分别决定使用它们。

另外因为我只使用标准颜色(白色除外),所以我只能做几个距离。如果你需要更多,那么你将不得不使用其他方式来制作你的颜色列表(或者根据距离制作一个返回颜色的函数)。它将采用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()

enter image description here