2015-10-28 2 views
0

Je suis nouveau à Python. Lors de l'exécution de ces lignes de code, je m'attends à deux chiffres distincts à enregistrer.Matplotlib condense deux chiffres en un en les sauvegardant

La figure no. 1:

#3) Create the graph 
N=int(raw_input('Number of nodes (sqrt): ')) 
G=nx.grid_2d_graph(N,N) 
pos = dict((n, n) for n in G.nodes()) #Dictionary of all positions 
labels = dict(((i, j), i + (N-1-j) * N) for i, j in G.nodes()) 
nx.draw_networkx(G, pos=pos, labels=labels,with_labels=False, node_size=10) 
#Plot the graph 
plt.axis('off') 
title_string=('Lattice Network') 
subtitle_string=(''+str(N)+'x'+str(N)+' = '+str(N*N)+' nodes') 
plt.suptitle(title_string, y=0.99, fontsize=17) 
plt.title(subtitle_string, fontsize=8) 
plt.savefig('100x100_lattice.png', dpi=1000,bbox='tight') #Figure no. 1 
plt.close() 

Figure no. 2:

#4) Plot the degree distribution 
for data_dict in node_degree.values(): 
    x=node_degree.keys() 
    y=node_degree.values() 
from collections import Counter 
occ=Counter(y) 
for data_dict in occ.values(): 
    plotx=occ.keys() 
    ploty=occ.values() 
Pk=numpy.zeros((len(ploty))) 
for i in range(0, len(ploty)): 
    Pk[i]=numpy.around(ploty[i]/(N*N),3) 
plt.scatter(plotx,Pk,color='red', edgecolors='darkred') 
plt.show() 
plt.xlabel('Node degree k') 
plt.ylabel('P(k)') 
plt.xlim(0,10,1) 
plt.xticks(numpy.arange(0, 11, 1.0)) 
plt.ylim(0,1) 
plt.yticks(numpy.arange(0, 1, 0.1)) 
title_string=('Degree Distribution') 
subtitle_string=('Lattice, '+str(N)+'x'+str(N)+' nodes') 
plt.suptitle(title_string, y=0.99, fontsize=17) 
plt.title(subtitle_string, fontsize=9) 
plt.tick_params(
    axis='x',   # changes apply to the x-axis 
    which='both',  # both major and minor ticks are affected 
    bottom='on',  # ticks along the bottom edge are off 
    top='on',   # ticks along the top edge are off 
    labelbottom='on') 
plt.savefig('100x100_lattice_Degree_Distrib.png', dpi=1000,bbox='tight') #Figure no. 2 
plt.close() 

Au lieu de cela, ce que je reçois visuellement est:

enter image description here

Mon problème. L'image à droite (dans le code Figure no. 2) est correcte. Celui de gauche (Figure no. 1) est faux, en ce sens qu'il ne devrait montrer que la structure régulière que vous voyez et non les points rouges, qui proviennent évidemment de la deuxième image. Il doit y avoir quelque chose de mal dans mes appels plt.show, mais je ne trouve pas de réponse. J'apprécie ton aide!

Répondre

1

Le problème est que plt.scatter() dans votre deuxième figure dessine à la figure qui a été créée dans votre premier chiffre, non? Ajoutez simplement un appel à plt.figure() avant votre appel à plt.scatter() dans la deuxième figure. Cela devrait régler votre problème ici.

+0

Cela fonctionne. Merci. Je suppose que le message à emporter est: * chaque fois que vous voulez tracer quelque chose dans matplotlib, assurez-vous que vous appelez * 'plt.figure()' * avant toute nouvelle intrigue *. – FaCoffee

+2

un message de prise encore mieux est d'utiliser l'interface orientée objet: 'fig = plt.figure(); ax = fig.add_subplot (111); ax.scatter (...) '. De cette façon, vous savez toujours quels 'Axes' vous tracez sur – tom

+2

ce que @tom dit. vraiment, vous devriez juste éviter d'utiliser 'plt' entièrement sauf pour créer des figures et des axes –