2017-03-11 1 views
0

Je veux dessiner un seul graphe networkX avec des éléments dans le tuple 'new'. Mes noeuds de graphe auront des étiquettes telles que "AXIN", et la couleur sera verte ou jaune.Python Networkx draw graphique - étiquettes/valeurs à l'intérieur du tuple

Je souhaite que le noeud soit de couleur verte, si 'NON REPORTE'. Si l'item [2] dans le tuple 'reporté', je veux que ce noeud soit de couleur jaune.

> new = (('AXIN', 37, 'reported'), ('LGR', 30, 'reported'), ('NKD', 
> 24, 'reported'), ('TNFRSF', 23, 'UNREPORTED'), ('CCND', 19, 
> 'reported'), ('APCDD', 18, 'reported'), ('TR', 16, 'UNREPORTED'), 
> ('TOX', 15, 'UNREPORTED'), ('LEF', 15, 'reported'), ('MME', 13, 
> 'reported')) 
> 
> X, Y, _ = zip(*new) import seaborn as sns sns.set() import 
> matplotlib.pyplot as plt %matplotlib inline plt.figure(figsize = (20, 
> 10)) mytitle = "Most common genes coexpressed with {gene1}, {gene2}, 
> {gene3}, {gene4}".format(gene1="axin2", gene2="lef", gene3="nkd1", 
> gene4="lgr5") plt.title(mytitle, fontsize=40) plt.ylabel('Number of 
> same gene encounters across studies', fontsize=20) ax = 
> plt.bar(range(len(X)), Y, 0.6, align='center', tick_label = X, 
> color="red") ax = plt.xticks(rotation=90) new = tuple(new) 
> 
> import networkx as nx children = sorted(new, key=lambda x: x[1]) 
> parent = children.pop()[0] 
> 
> G = nx.Graph() for child, weight, _ in children: G.add_edge(parent, 
> child, weight=weight) width = list(nx.get_edge_attributes(G, 
> 'weight').values()) colors = [] for i in new: 
>   if i[2] == 'UNREPORTED': 
>     colors.append('green') 
>   elif i[2] == 'reported': 
>     colors.append('yellow') print(colors) plt.savefig("plt.gene-expression.pdf") plt.figure(figsize = (20, 10)) 
> mytitle = "Most common genes coexpressed with {gene1}, {gene2}, 
> {gene3}, {gene4}".format(gene1="axin2", gene2="lef", gene3="nkd1", 
> gene4="lgr5") plt.title(mytitle, fontsize=40) 
> 
> nx.draw_networkx(G, font_size=10, node_size=2000, alpha=0.6, 
> node_color=colors) plt.savefig("gene-expression-graph.pdf") 

Avec ce code, j'obtiens deux graphes différents, avec des nœuds jaunes, d'autres avec des nœuds verts.

Répondre

0

Vous pouvez utiliser une compréhension de dictionnaire avec l'opérateur ternaire pour créer un mappage des nœuds aux couleurs. Cela peut être utilisé pour colorer les nœuds lors du dessin du graphique.

import networkx as nx 

new = (('AXIN', 37, 'reported'), ('LGR', 30, 'reported'), ('NKD', 24, 'reported'), ('TNFRSF', 23, 'UNREPORTED'), ('CCND', 19, 'reported'), ('APCDD', 18, 'reported'), ('TR', 16, 'UNREPORTED'), ('TOX', 15, 'UNREPORTED'), ('LEF', 15, 'reported'), ('MME', 13, 'reported')) 
children = sorted(new, key=lambda x: x[1]) 
node_color = {node[0]: 'y' if node[2] == 'reported' else 'g' for node in children} 
parent = children.pop()[0] 
G = nx.Graph() 
for child in children: G.add_edge(parent, child[0]) 
nx.draw_networkx(G, node_color=[node_color[i] for i in G.nodes()]) 

enter image description here

+0

Merci @h_s. malheureusement, il assigne la couleur verte à l'un des nœuds. Pas spécifiquement aux nœuds "NON-SIGNALÉS" seulement. Je m'attendais à ce que TNFRSF, TOX et TR soient des nœuds verts. Mais j'ai obtenu l'APCDD comme un nœud vert, ce qui est faux parce que l'APCDD est signalé. –

+0

@ J.A J'ai maintenant fourni une réponse plus complète avec un exemple de travail minimal. J'espère que cela t'aides! – harryscholes

+0

merci beaucoup, fonctionne maintenant –