FigureCanvasAgg'объект не имеет атрибута'invalidate'? прорисовка питона
Я следил за "питоном для анализа данных". На стр. 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'
4 ответа
Я нашел эту ошибку из-за комбинации:
- использование построения панд с использованием метода членов серии или данных
- построение графика с указателем даты
- с помощью
%matplotlib inline
магия в ипифоне - импорт модуля pylab до магии matplotlib
Таким образом, следующее произойдет с ошибкой во вновь запущенном ядре в записной книжке 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
модуль.
Не ответ, но я не могу понять, как поместить кодовый блок в комментарии:)
Так что я добрался до этого вопроса, потому что на моем 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 для ноутбуков и перезапустил ее, очистил... пожимает плечами...
Кажется, я решил проблему (по крайней мере, в моем случае).
Я запускаю IPython на Mac с использованием Python 2.7 и получаю ту же ошибку.
Казалось, это проблема с бэкэндом, так как, когда я смотрел на "док", было открыто довольно много экземпляров Python Launcher (хотя я не был уверен, почему это произошло в первую очередь).
Принудительное закрытие заставило ядро python перезапуститься и, похоже, исправило мою проблему.
Встроенный код по-прежнему на месте, и графики отображаются правильно.
У меня возникает эта ошибка, когда я использую неинтерактивный сервер (например, matplotlib.use('svg')
)
Исправление для меня заключалось в изменении серверной части (например, matplotlib.use('Qt5Agg')
)
Другие ответы не сработали для меня. Вместо этого моя проблема была в том, что я запускал ноутбук с ipython notebook --pylab
, Однажды я бросил --pylab
все снова заработало.
Поэтому убедитесь, что вы запускаете ноутбук ipython только с ipython notebook
,
(На самом деле, при использовании --pylab
но я пропустил это до сих пор.)
Я решил проблему, добавив %matplotlib inline
в первой ячейке кода ноутбука jupyter и запустив его