FigureCanvasAgg ‘objeto no tiene atributo’ invalidar ‘? trazado de pitones

He estado siguiendo ‘python para análisis de datos’. En la pág. 345, se llega a este código para trazar rendimientos en una variedad de acciones. Sin embargo, la función de trazado no funciona para mí. Obtengo el objeto FigureCanvasAgg ‘no tiene ningún atributo’ invalidar ‘?

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() 

ACTUALIZACIÓN: rastreo completo

 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last)  in () 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' 

Encontré que este error se debe a una combinación de:

  • Uso de pandas que trazan con una serie o un método de miembro de dataframe
  • trazar con un índice de fecha
  • usando %matplotlib inline magic en ipython
  • importando el módulo pylab antes de la magia matplotlib

Entonces, lo siguiente fallará en un kernel recién iniciado en una notebook 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() 

La mejor manera de resolver esto es mover la magia a la cima:

 # 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() 

Sin embargo, el problema también desaparece si pasa la serie a un método de trazado matplotlib , no use un índice de fecha o simplemente no importe el módulo matplotlib.pylab .

No es una respuesta, pero no puedo entender cómo poner el código en los comentarios 🙂

Así que llegué a esta pregunta porque estaba sucediendo exactamente lo mismo en mi 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' 

De todos modos, sé que no es satisfactorio, pero al cerrar el servicio de mi portátil ipython y al reiniciarlo, lo solucioné … encogiéndose de hombros …

Parecía resolver el problema (bueno, al menos en mi caso).

Estoy ejecutando IPython en un mac con python 2.7 y obtuve el mismo error.

Parecía ser un problema con el backend, ya que cuando miré el “dock”, se habían abierto bastantes instancias de Python Launcher (aunque no estaba seguro de por qué sucedió esto en primer lugar).

Forzar que se cerraran provocó que el kernel de Python se reiniciara y parece haber solucionado mi problema.

El código en línea todavía está en su lugar y los gráficos se muestran correctamente .

Las otras respuestas no funcionaron para mí. En cambio, mi problema fue porque estaba iniciando el portátil con ipython notebook --pylab . Una vez que dejé caer el --pylab cosas volvieron a funcionar.

Así que asegúrese de iniciar ipython notebook solo con ipython notebook .

(En realidad, hay una advertencia emitida cuando usas --pylab pero la perdí hasta ahora).