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