2

ツリー イメージを作成しました。質問を参照してください。
今、私はいくつかの主要なグループを持っています。
1 つのグループには、緑と茶色のノードがあり、「B」と「A」があります。2 番目のグループにはピンクのノードと「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')

上記と同様の関数を実行したので、node の代わりに 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 が含まれている場合は、エッジに色を付ける方法があります。どう思いますか?

誰もこれを行う方法を知っていますか?

ありがとうございました

4

1 に答える 1

4

ノードを反復処理し、各ノードのリストに 1 つの色を追加していると推測しています (そのスニペットが残りのコードにどのように適合するかがわからないため) 。エラー メッセージが示すように、各エッジに必要な色を計算する必要があります。それはもっとトリッキーになるでしょう。

わかりました!コードは少し整理できますが、これは機能します。

#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

色のある木

于 2010-12-06T13:55:22.830 に答える