如何从networkx获取不同颜色的边
我创建了一个树形图,具体可以查看这个问题。
现在我有一些主要的分组。
其中一个组有绿色和棕色的节点,里面有字母'B'和'A'。第二个组只有粉色的节点和字母'T',最后一个组有黄色、橙色和蓝色的节点,字母是'L'、'X'和'H'。这些颜色是节点的颜色,而字母是它们的名称。所以我想给不同组的边缘上色。
#taken from draw_graphviz
def get_label_mapping(G, selection):
for node in G.nodes():
if (selection is None) or (node in selection):
try:
label = str(node)
if label not in (None, node.__class__.__name__):
yield (node, label)
except (LookupError, AttributeError, ValueError):
pass
labels = dict(get_label_mapping(G, None))
for label in labels.keys():
if str(label) != "Clade":
num = label.name.split('-')
if 'T' in num[0]:
node_colors.append('#CC6699')
elif 'X' in num[0]:
node_colors.append('r')
else:
node_colors.append('y')
所以我做了一个和上面类似的函数,不过我把节点改成了获取边缘(get_edge)。然后我尝试了这个:
for edge in edges.keys():
if str(edge) != "Clade":
if 'T' in edge:
edge_colors.append('b')
这里的边缘是:
(Clade(branch_length=-0.00193, name='T-7199-8'), Clade(branch_length=0.00494))
也许可以用某种方式来判断如果名字里有'T',那么就给边缘上色。你觉得怎么样?
有没有人知道怎么做这个?
谢谢!
1 个回答
4
我猜测(因为我不知道这段代码在整个程序中是怎么用的),你是在遍历这些节点,然后为每个节点添加一种颜色。就像错误信息所说的,你需要找出每条边所需的颜色。这会更复杂一些。
好的,明白了!这段代码可以稍微整理一下,但现在这样也能用。
#Define your centre node: you need to pull this out of the graph. Call it b.
# The number changes each time: look for a Clade(branch_length=0.03297)
# Its neighbors have branch lengths .00177, .01972, .00774.
b = G.nodes()[112]
# Recursively paint edges below a certain point, ignoring ones we've already seen
def paintedges(graph, startnode, colour):
for node in graph.neighbors(startnode):
if node not in alreadyseen: # alreadyseen is in global scope
graph[startnode][node]["colour"] = colour
alreadyseen.add(node)
paintedges(graph, node, colour)
alreadyseen = set([b])
G[b][G.neighbors(b)[0]]["colour"] = "red"
paintedges(G, G.neighbors(b)[0], "red")
G[b][G.neighbors(b)[1]]["colour"] = "blue"
paintedges(G, G.neighbors(b)[1], "blue")
G[b][G.neighbors(b)[2]]["colour"] = "green"
paintedges(G, G.neighbors(b)[2], "green")
# Now make a list of all the colours, in the order networkx keeps the edges
edgecolours = [G[f][t]["colour"] for f,t in G.edges()]
kwargs["edge_color"] = edgecolours