2010-12-06 7 views
1

Ich habe ein Baum Bild erstellt, siehe question.
Jetzt habe ich einige wichtige Gruppen.
Eine Gruppe hat Knoten mit Farbe grün und braun und hat ein "B" und ein "A". Die zweite Gruppe hat nur rosa Knoten und "T" und die letzte Gruppe hat Gelb, Orange und Blau und die Buchstaben "L", "X" und "H". Die Farben beziehen sich auf die Farben der Knoten und die Buchstaben gehören zum Namen. Also möchte ich den Rand der verschiedenen Gruppen einfärben.Wie bekomme ich Kanten von Netzwerk x zu Farbe anders

also habe ich eine ähnliche Funktion wie oben, anstelle von Knoten, habe ich zu get_edge geändert. und versuchen Sie dies:

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

wo Rand ist:

(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ärben. Was zu dir denken?

weiß jemand, wie man das macht?

Danke

+0

Wenn Sie sagen, „wenn ein T im Namen, dann den Rand Farbe“, haben Sie den Namen der * Rand * bedeuten, oder den Namen eines Knotens (oder beide Knoten) Vorfall an der Kante? Kannst du bitte auch die volle for-Schleife zeigen? Es wird einfacher sein, Ihnen zu helfen, wenn wir sehen können, über was genau Sie iterieren. – gotgenes

+0

T ist im Namen des Knotens, also mache ich etwas wie: Wenn T im Knoten ist, färbe die Kante. Die Schleife war in der anderen Frage, aber ich bin Update meine Frage und stelle ein bisschen mehr Code :) – pavid

+0

mit den Node_Farben Ich ändere die Farben des Knotens, was ich möchte, wenn zum Beispiel alle Knoten, die rote Farbe haben, haben eine Kante blau, oder etwas ähnliches. Hoffe ich habe mich klar genug gemacht – pavid

Antwort

2

Ich vermute, (da ich weiß nicht, wie das Snippet passt zum Rest des Codes in), die Sie über die Knoten und das Hinzufügen einer Farbe zur sind Iterieren Liste für jeden Knoten. Wie die Fehlermeldung suggeriert, müssen Sie die Farbe für jede Kante erarbeiten. Das wird komplizierter.

In Ordnung, hab es! Der Code könnte etwas 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 

Tree with colours

+0

das ist richtig, ich bin über die Knoten iterieren. Aber ich bin nicht wirklich sicher, wie ich die Kanten von den Gruppen bekomme, die ich will – pavid

+0

Von Ihrem vorherigen Code erzeugt BioPython die Ränder für Sie.Wenn es nicht die Fähigkeit hat, die Kanten zu färben, wenn das Netzwerkx-Diagramm erzeugt wird, müssen Sie die Kanten selbst für 'von von bis in die Grafik.edges()' bekommen. Siehe die networkx Dokumentation: http://networkx.lanl.gov/tutorial/tutorial.html#edge-attributes –

+0

ok, also muss ich sowas wie Edge in G.edge() machen aber dann wie ich das kann sagen wir, die Kante, die zu Knoten 1 und 2 gehört, sollte rot sein. Ich habe gelbe, magenta, grüne, blaue, braune Knoten. Und ich würde sagen color_edge = red wenn node_color = blau und grün zum Beispiel – pavid

Verwandte Themen