Frage

Ich habe einen Baum Bild aufgebaut, Frage .
Jetzt habe ich einige große Gruppen.
Eine Gruppe hat Knoten mit Farbe grün und braun und hat ein ‚B‘ und A ‚A‘. Die zweite Gruppe hat nur rosa Knoten und ‚T‘ und die letzte Gruppe hat gelbe, orange und blau, und die Buchstaben ‚L‘, ‚X‘ und ‚H‘. die Farben beziehen sich auf die Farben der Knoten und die Buchstaben gehören in den Namen. Deshalb möchte ich den Rand der verschiedenen Gruppen färben.

#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')

so dass ich eine ähnliche Funktion wie die oben getan habe, anstelle von Knoten, änderte es get_edge. und versuchen Sie dies:

  for edge in edges.keys():
        if str(edge) != "Clade":
            if 'T' in edge:
                edge_colors.append('b')

Dabei gilt Kante:

(Clade(branch_length=-0.00193, name='T-7199-8'), Clade(branch_length=0.00494))

Vielleicht ist es eine Möglichkeit zu sagen, wenn T in Namen, dann den Rand färbt. Was denken Sie?

jemand weiß, wie dies zu tun?

Danke

War es hilfreich?

Lösung

Ich vermute, (da ich weiß nicht, wie das Snippet paßt in den Rest des Codes), dass Sie Iterieren über die Knoten , und das Hinzufügen von einer Farbe zur Liste für jeder Knoten. Wie die Fehlermeldung schon sagt, müssen Sie die Farbe für jeden Rand erforderlich arbeiten . Das wird schwieriger sein.

In Ordnung, hat es! Der Code könnte ein wenig aufgeräumt werden, aber das funktioniert.

#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

Baum mit Farben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top