Объект FigureCanvasAgg не имеет атрибута "invalidate"? построение питона

Я слежу за "python для анализа данных". На стр. 345, вы добираетесь до этого кода, чтобы отображать доходность по множеству запасов. Однако функция построения графика не работает для меня. я получил Объект FigureCanvasAgg не имеет атрибута "invalidate"?

names = ['AAPL','MSFT', 'DELL', 'MS', 'BAC', 'C'] #goog and SF did not work
def get_px(stock, start, end):
    return web.get_data_yahoo(stock, start, end)['Adj Close']
px = pd.DataFrame({n: get_px(n, '1/1/2009', '6/1/2012') for n in names})

#fillna method pad uses last valid observation to fill
px = px.asfreq('B').fillna(method='pad')
rets = px.pct_change()
df2 = ((1 + rets).cumprod() - 1)

df2.ix[0] = 1

df2.plot()

ОБНОВЛЕНИЕ: полная трассировка

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-122-df192c0432be> in <module>()
      6 df2.ix[0] = 1
      7 
----> 8 df2.plot()

//anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in plot_frame(frame, x, y, subplots, sharex, sharey, use_index, figsize, grid, legend, rot, ax, style, title, xlim, ylim, logx, logy, xticks, yticks, kind, sort_columns, fontsize, secondary_y, **kwds)
   1634                      logy=logy, sort_columns=sort_columns,
   1635                      secondary_y=secondary_y, **kwds)
-> 1636     plot_obj.generate()
   1637     plot_obj.draw()
   1638     if subplots:

//anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in generate(self)
    854         self._compute_plot_data()
    855         self._setup_subplots()
--> 856         self._make_plot()
    857         self._post_plot_logic()
    858         self._adorn_subplots()

//anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in _make_plot(self)
   1238         if not self.x_compat and self.use_index and self._use_dynamic_x():
   1239             data = self._maybe_convert_index(self.data)
-> 1240             self._make_ts_plot(data, **self.kwds)
   1241         else:
   1242             lines = []

//anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in _make_ts_plot(self, data, **kwargs)
   1319                 self._maybe_add_color(colors, kwds, style, i)
   1320 
-> 1321                 _plot(data[col], i, ax, label, style, **kwds)
   1322 
   1323         self._make_legend(lines, labels)

//anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in _plot(data, col_num, ax, label, style, **kwds)
   1293         def _plot(data, col_num, ax, label, style, **kwds):
   1294             newlines = tsplot(data, plotf, ax=ax, label=label,
-> 1295                                 style=style, **kwds)
   1296             ax.grid(self.grid)
   1297             lines.append(newlines[0])

//anaconda/lib/python2.7/site-packages/pandas/tseries/plotting.pyc in tsplot(series, plotf, **kwargs)
     79 
     80     # set date formatter, locators and rescale limits
---> 81     format_dateaxis(ax, ax.freq)
     82     left, right = _get_xlim(ax.get_lines())
     83     ax.set_xlim(left, right)

//anaconda/lib/python2.7/site-packages/pandas/tseries/plotting.pyc in format_dateaxis(subplot, freq)
    258     subplot.xaxis.set_major_formatter(majformatter)
    259     subplot.xaxis.set_minor_formatter(minformatter)
--> 260     pylab.draw_if_interactive()

//anaconda/lib/python2.7/site-packages/IPython/utils/decorators.pyc in wrapper(*args, **kw)
     41     def wrapper(*args,**kw):
     42         wrapper.called = False
---> 43         out = func(*args,**kw)
     44         wrapper.called = True
     45         return out

//anaconda/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.pyc in draw_if_interactive()
    227         figManager =  Gcf.get_active()
    228         if figManager is not None:
--> 229             figManager.canvas.invalidate()
    230 
    231 

AttributeError: 'FigureCanvasAgg' object has no attribute 'invalidate'

Ответы

Ответ 1

Я обнаружил, что эта ошибка связана с комбинацией:

  • с использованием построения pandas с использованием метода рядов или элементов данных.
  • с индексом даты
  • с использованием магии %matplotlib inline в ipython
  • импортировать модуль pylab до матрона матлотлиба

Таким образом, следующее: вновь запущенное ядро ​​ в ноутбуке ipython:

# fails 
import matplotlib.pylab
%matplotlib inline

import pandas
ser = pandas.Series(range(10), pandas.date_range(end='2014-01-01', periods=10))
ser.plot()

Лучший способ решить это - переместить магию вверх:

# succeeds
%matplotlib inline # moved up
import matplotlib.pylab

import pandas
ser = pandas.Series(range(10), pandas.date_range(end='2014-01-01', periods=10))
ser.plot()

Однако проблема также исчезает, если вы передаете серию методу построения matplotlib, не используйте индекс даты или просто не импортируете модуль matplotlib.pylab.

Ответ 2

Не ответ, но я не могу понять, как добавить код в комментарии:)

Итак, я дошел до этого вопроса, потому что то же самое происходило на моем Mac

/Users/briford/myPVE/workbench/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.pyc in draw_if_interactive()
    227         figManager =  Gcf.get_active()
    228         if figManager is not None:
--> 229             figManager.canvas.invalidate()
    230 
AttributeError: 'FigureCanvasAgg' object has no attribute 'invalidate'

В любом случае, я знаю, что это не удовлетворительно, но просто завершение работы моего ноутбука ipython и его перезапуск очистили его... shrug...

Ответ 3

Кажется, я решил проблему (ну, по крайней мере, в моем случае).

Я запускаю IPython на mac с помощью python 2.7 и получаю ту же ошибку.

Казалось, что это проблема с бэкэнд, так как, когда я смотрел на "док", было открыто несколько экземпляров Python Launcher (не знаю, почему это произошло в первую очередь).

Принудительное закрытие ядра python для перезагрузки и, похоже, устранило мою проблему.

встроенный код по-прежнему на месте и отображаются правильно.

Ответ 4

Другие ответы не помогли мне. Вместо этого моя проблема состояла в том, что я начал работать с ноутбуком ipython notebook --pylab. Как только я уронил --pylab, все снова работало.

Поэтому убедитесь, что вы запускаете ipython-ноутбук только с ipython notebook.

(На самом деле предупреждение выдается при использовании --pylab, но я пропустил его до сих пор.)