2017-02-03 1 views
3

Во-первых, я должен сказать, что я настоящий новичок в Python (и в самом программировании), так что это может быть глупый вопрос, но я не мог найти решение.Ошибка с plt.savefig в цикле

Я загружаю данные из трех разных CSV-файлов, затем делаю некоторые вычисления и, в конце концов, хочу сохранить 3 тепловых карты. Моя проблема заключается в экономии. Когда я использую plt.savefig('whatever.jpg'), он, очевидно, сохраняет только последнюю тепловую карту в цикле. Я попытался изменить его на plt.savefig('{}.jpg'.format(i)), но у меня есть ошибка, и я не знаю, как исправить. Буду признателен за любые намеки! (Python 3 из Anaconda)

import seaborn as sns 
import pandas as pd 
import matplotlib.pyplot as plt 
%matplotlib inline 

instrumenty = ['gold','sp500','dax'] 

for i in instrumenty: 

    i = pd.read_csv(i+'_m.csv', sep=',') 
    i['Miesiąc'] = pd.DatetimeIndex(i['Data']).month 
    i['Rok'] = pd.DatetimeIndex(i['Data']).year 
    i['Zmiana']=i['Zamkniecie'].pct_change() 
    i_pt = i[1:].pivot_table(index='Rok',columns='Miesiąc',values='Zmiana') 
    sns.heatmap(i_pt, linewidths=1, cmap='PiYG') 
    plt.savefig('{}.png'.format(i)) 
    plt.clf() 

И ошибка:

FileNotFoundError       Traceback (most recent call last) 
<ipython-input-30-5729b6a0480f> in <module>() 
    14  i_pt = i[1:].pivot_table(index='Rok',columns='Miesiąc',values='Zmiana') 
    15  sns.heatmap(i_pt, linewidths=1, cmap='PiYG') 
---> 16  plt.savefig('{}.png'.format(i)) 
    17  plt.clf() 
    18 

C:\Users\user\Anaconda3\lib\site-packages\matplotlib\pyplot.py in savefig(*args, **kwargs) 
    694 def savefig(*args, **kwargs): 
    695  fig = gcf() 
--> 696  res = fig.savefig(*args, **kwargs) 
    697  fig.canvas.draw_idle() # need this if 'transparent=True' to reset colors 
    698  return res 

C:\Users\user\Anaconda3\lib\site-packages\matplotlib\figure.py in savefig(self, *args, **kwargs) 
    1561    self.set_frameon(frameon) 
    1562 
-> 1563   self.canvas.print_figure(*args, **kwargs) 
    1564 
    1565   if frameon: 

C:\Users\user\Anaconda3\lib\site-packages\matplotlib\backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs) 
    2230     orientation=orientation, 
    2231     bbox_inches_restore=_bbox_inches_restore, 
-> 2232     **kwargs) 
    2233   finally: 
    2234    if bbox_inches and restore_bbox: 

C:\Users\user\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py in print_png(self, filename_or_obj, *args, **kwargs) 
    530   renderer.dpi = self.figure.dpi 
    531   if is_string_like(filename_or_obj): 
--> 532    filename_or_obj = open(filename_or_obj, 'wb') 
    533    close = True 
    534   else: 

Даже без plt.savefig я делаю что-то неправильно, потому что результат one strange chart with 3 legends вместо 3-х картах.

+0

Попробуйте добавить 'plt.close()' 'после того, как plt.savefig (...) '. Кроме того, я думаю, что формат вывода по умолчанию для цифр matplotlib - 'png', но кто-то может исправить меня, если я ошибаюсь. – tmwilson26

+0

Пожалуйста, уменьшите это до минимального рабочего примера, подумайте о простом графике и попытайтесь использовать 'savefig' один раз, показывая соответствующий вывод и сообщение об ошибке. Также укажите, какую версию python вы используете (Python 3 из Anaconda?). – oliversm

+0

@ tmwilson26 К сожалению, я не помог. – Szymon

ответ

3

перенастройка i здесь:

instrumenty = ['gold','sp500','dax'] 
for i in instrumenty: 
    i = pd.read_csv(i+'_m.csv', sep=',') 

Лучше использовать name:

for name in instrumenty: 
    # use `name` 
    i = pd.read_csv(name +'_m.csv', sep=',') 
    i['Miesiąc'] = pd.DatetimeIndex(i['Data']).month 
    i['Rok'] = pd.DatetimeIndex(i['Data']).year 
    i['Zmiana']=i['Zamkniecie'].pct_change() 
    i_pt = i[1:].pivot_table(index='Rok',columns='Miesiąc',values='Zmiana') 
    sns.heatmap(i_pt, linewidths=1, cmap='PiYG') 
    plt.savefig('{}.png'.format(name)) 
    plt.clf() 

Это важная часть:

plt.savefig('{}.png'.format(name)) 
+0

Простой. Большое спасибо! – Szymon