2017-03-14 2 views
0

Modifier 15/03/2017 24:00 CDT: J'ai réussi à corriger l'erreur dans le programme et compléter le programme tel qu'il a été conçu. J'aimerais remercier berna1111 et TigerhawkT3 pour leurs réponses, puisqu'elles m'ont permis de terminer ce programme. Merci encore, Stack Overflow!Pourquoi j'obtiens "AttributeError: l'objet 'tuple' n'a pas d'attribut 'savefig'"?


Je tente de sauver une série d'histogrammes construit un tableau (tableaux réalisés avec numpy et en utilisant matplotlib histogrammes) pour .png fichiers de type. Je reçois le message d'erreur suivant:

Traceback (most recent call last): 
    File "C:/Users/Ryan/PycharmProjects/NWS/weather_data.py", line 475, in <module> 
    figure1.savefig("{}_temperature.png".format(filename)) 
AttributeError: 'tuple' object has no attribute 'savefig' 

La section l'erreur fait référence est ci-dessous:

figure1 = plt.hist(temperature_graph_array, color="blue") 
figure2 = plt.hist(feelslike_graph_array, color="blue") 
figure3 = plt.hist(windspeed_graph_array, color="blue") 
figure4 = plt.hist(windgustspeed_graph_array, color="blue") 
figure5 = plt.hist(pressure_graph_array, color="blue") 
figure6 = plt.hist(humidity_graph_array, color="blue") 

figure1.savefig("{}_temperature.png".format(filename), format='png') 
figure2.savefig("{}_feelslike.png".format(filename), format='png') 
figure3.savefig("{}_windspeed.png".format(filename), format='png') 
figure4.savefig("{}_windgustspeed.png".format(filename), format='png') 
figure5.savefig("{}_pressure.png".format(filename), format='png') 
figure6.savefig("{}_humidity.png".format(filename), format='png') 

Pourquoi est-ce que je reçois cette erreur, et comment puis-je résoudre ce problème? Si quelqu'un pouvait me le faire savoir, je l'apprécierais grandement.


Notes:

  • je l'ai fait une recherche Google et a trouvé quelques erreurs similaires, mais aucun où le chiffre a été interprété comme un tuple. Je ne comprends pas d'où vient la partie tuple. Les éléments "_graph_array" dans les étapes de création d'histogrammes sont des tableaux de dimensions 10 long, 1 grand. 10 articles au total à l'intérieur, désignés comme type Float.

  • La variable "filename" dans l'étape d'enregistrement représente une chaîne contenant la date et l'heure.


+0

'plt.hist' ne retourne pas' figure' instace, vous devez créer un personnage ('fig.1 = plt .figure() '), un axe dessus (' ax1 = fig1.add_subplots (111) ') puis dessine sur l'axe (' ax1.hist (...) '). À ce stade, vous devriez être en mesure de sauvegarder la figure ('fig1.savefig (...)'). Publiera une réponse après le test. – berna1111

+0

Correction: 'ax1 = fig1.add_subplot (111)', pas 'ax1 = fig1.add_subplot' * s *' (111) '! – berna1111

Répondre

2

J'ai adapté votre code et a pris la liberté de modifier les plusieurs lignes créant une figure par la liste dans la compréhension des boucles pour:

import matplotlib.pyplot as plt 
# should be equal when using .pylab 
import numpy.random as rnd 

# generate_data 
n_points = 1000 
temperature_graph_array = rnd.random(n_points) 
feelslike_graph_array = rnd.random(n_points) 
windspeed_graph_array = rnd.random(n_points) 
windgustspeed_graph_array = rnd.random(n_points) 
pressure_graph_array = rnd.random(n_points) 
humidity_graph_array = rnd.random(n_points) 
list_of_data = [temperature_graph_array, 
       feelslike_graph_array, 
       windspeed_graph_array, 
       windgustspeed_graph_array, 
       pressure_graph_array, 
       humidity_graph_array] 
list_of_names = ['temperature', 
       'feelslike', 
       'windspeed', 
       'windgustspeed', 
       'pressure', 
       'humidity'] 

# create the figures: 
#figure1 = plt.figure() 
#figure2 = plt.figure() 
#figure3 = plt.figure() 
#figure4 = plt.figure() 
#figure5 = plt.figure() 
#figure6 = plt.figure() 
#list_of_figs = [figure1, figure2, figure3, figure4, figure5, figure6] 
## could be: 
list_of_figs = [plt.figure() for i in range(6)] 

# create the axis: 
#ax1 = figure1.add_subplot(111) 
#ax2 = figure2.add_subplot(111) 
#ax3 = figure3.add_subplot(111) 
#ax4 = figure4.add_subplot(111) 
#ax5 = figure5.add_subplot(111) 
#ax6 = figure6.add_subplot(111) 
#list_of_axis = [ax1, ax2, ax3, ax4, ax5, ax6] 
## could be: 
list_of_axis = [fig.add_subplot(111) for fig in list_of_figs] 

# plot the histograms 
# notice `plt.hist` returns a tuple (n, bins, patches) or 
# ([n0, n1, ...], bins, [patches0, patches1,...]) if the input 
# contains multiple data 
#hist1 = ax1.hist(temperature_graph_array, color="blue") 
#hist2 = ax2.hist(feelslike_graph_array, color="blue") 
#hist3 = ax3.hist(windspeed_graph_array, color="blue") 
#hist4 = ax4.hist(windgustspeed_graph_array, color="blue") 
#hist5 = ax5.hist(pressure_graph_array, color="blue") 
#hist6 = ax6.hist(humidity_graph_array, color="blue") 
#list_of_hists = [hist1, hist2, hist3, hist4, hist5, hist6] 
## could be: 
list_of_hists = [] 
for i, ax in enumerate(list_of_axis): 
    list_of_hists.append(ax.hist(list_of_data[i], color="blue")) 

filename = 'output_graph' 
for i, fig in enumerate(list_of_figs): 
    name = list_of_names[i].capitalize() 
    list_of_axis[i].set_title(name) 
    fig.tight_layout() 
    fig.savefig("{}_{}.png".format(filename,name), format='png') 

ne publierez pas les chiffres obtenus, mais cela donne moi 6 petits fichiers .png dans le même dossier que le script.

Mieux encore, vous pouvez utiliser une fonction pour faire tout ce qui à vos données:

def save_hist(data, name, filename): 
    fig = plt.figure() 
    ax = fig.add_subplot(111) 
    ax.hist(data, color="blue") 
    ax.set_title(name) 
    fig.tight_layout() 
    fig.savefig("{}_{}.png".format(filename,name), format='png') 
    plt.close(fig) 

filename = 'output_graph_2' 
for data, name in zip(list_of_data, list_of_names): 
    save_hist(data, name, filename) 
+0

Ça a l'air bien, merci pour votre aide! –

3

De l'documentation for matplotlib.pyplot.hist:

The return value is a tuple (n , bins , patches) or ([ n0 , n1 , ...], bins , [ patches0 , patches1 ,...]) if the input contains multiple data.

De l'documentation for matplotlib.pyplot.savefig:

Save the current figure.

Il semble que vous devriez appeler savefig de la même manière que vous appelez hist, pas sur la résultat de l'appel hist.

plt.savefig("{}_temperature.png".format(filename), format='png') 
... 
+0

Merci pour votre réponse, mais cela ne fonctionne pas. Lors de l'exécution de la fonction "hist", cette étape crée réellement les graphiques. Sans la création des graphiques, il n'y a pas de graphique à sauvegarder. Votre solution supprime simplement la création des graphiques. –

+0

@RyanWitek - Oui, vous devez appeler 'hist()', puis 'savefig()', mais 'savefig' est une méthode de' matplotlib.pyplot', pas une méthode de ce que 'hist()' renvoie (un tuple). – TigerhawkT3