2015-10-04 1 views
0

J'ai donc la fonction suivante pour dessiner un problème sur lequel je travaille. C'est fondamentalement un problème de détection de nœud critique ou d'interdiction. J'ai quelques valeurs x, et la décision d'attaquer le noeud z. Fondamentalement, je veux colorier mon graphique avec des nœuds actifs et inactifs et des nœuds qui sont traités/attaquer. Voici ce que j'ai jusqu'ici.Légende pour la fonction de dessin networkx

def draw_solution (g, zsolution, xsolution, T, xmin = 0, filename = 'test.pdf'):

# draw solution 
pos = {n: ndata['coord'] for n,ndata in g.nodes_iter(data=True)} 
ncolour=[] 
for n,ndata in g.nodes_iter(data=True): 
    if ndata['fuel_load'] < xmin: 
     ncolour.append('gold') 
    else: 
     ncolour.append('yellowgreen') 
pp = PdfPages(filename) 
fig = plt.figure(figsize=(11.7,8.3)) 
fig.suptitle('full graph and initial fuel load') 
plt.axis('off') 
nx.draw_networkx(g, pos, font_size=9, node_color=ncolour) 
fig.savefig(pp, format='pdf') 
fig.clf() 

for t in range(T): 
    g_copy = g.copy() 
    #node colour 
    ncolour=[] 
    for i in g.nodes_iter(): 
     if zsolution[i,t] > 0.99: 
      ncolour.append('lightcoral') 
      #g_copy.remove_edges_from(g.edges(i)) 
     elif xsolution[i,t] < xmin: 
      ncolour.append('gold') 
      g_copy.remove_edges_from(g.edges(i)) 
     else: 
      ncolour.append('yellowgreen') 

    plt.axis('off') 
    fig.suptitle('t={}, before treatment'.format(t)) 
    nx.draw_networkx(g_copy, pos, font_size=9, node_color=ncolour, label=ncolour) 
    fig.savefig(pp, format='pdf') 
    fig.clf() 

    g_copy = g.copy() 
    #node colour 
    ncolour=[] 
    for i in g.nodes_iter(): 
     if zsolution[i,t] > 0.99: 
      ncolour.append('lightcoral') 
      g_copy.remove_edges_from(g.edges(i)) 
     elif xsolution[i,t] < xmin: 
      ncolour.append('gold') 
      g_copy.remove_edges_from(g.edges(i)) 
     else: 
      ncolour.append('yellowgreen') 

    plt.axis('off') 
    fig.suptitle('t={}, after treatment'.format(t)) 
    nx.draw_networkx(g_copy, pos, font_size=9, node_color=ncolour, label=ncolour) 
    fig.savefig(pp, format='pdf') 
    fig.clf() 

pp.close() 
fig.clf() 

Pour une raison quelconque, je ne peux pas obtenir le droit de la légende?

Aidez s'il vous plaît! Merci!

+0

Qu'est-ce que vous voulez que cela n'arrive pas? - Que veux-tu dire par "la légende"? – Joel

+0

Je veux une légende correspondant aux couleurs. donc je voudrais quelque chose comme lightcoral - attaque or - actif yellowgreen - inactif –

Répondre

3

Est-ce ce que vous cherchez?

import networkx as nx 
import matplotlib.pyplot as plt 
G=nx.fast_gnp_random_graph(20,0.2) 

rednodes = [1,2,4,5] 
bluenodes = [10,12] 
greennodes=[3,6,9] 
yellowgreennodes = [node for node in G.nodes() if node not in rednodes+greennodes+bluenodes] 
pos = nx.spring_layout(G) 
nx.draw_networkx_nodes(G,pos=pos,nodelist=rednodes, node_color='red', label='red nodes') 
nx.draw_networkx_nodes(G,pos=pos,nodelist=bluenodes, node_color='blue', label='blue nodes') 
nx.draw_networkx_nodes(G,pos=pos,nodelist=greennodes, node_color='green', label='green nodes') 
nx.draw_networkx_nodes(G,pos=pos,nodelist=yellowgreennodes, node_color='yellowgreen', label='yellowgreen nodes') 
nx.draw_networkx_edges(G,pos=pos) 
plt.legend(numpoints = 1) 
plt.show() 

enter image description here

Je ne suis pas tout à fait clair pourquoi il complote plusieurs points dans la légende ... Je pensais que numpoints=1 prendrait soin de cela. éditer Apparemment, cela peut être géré par ceci: Setting numpoints in matplotlib legend does not work