我在 ipython 笔记本中绘图时遇到问题。基本上,当我在 Canopy 编辑器命令窗口中执行它时,相同的代码会生成我想要的图,但是在笔记本中只使用了
KeyError:matplotlib.axes.AxesSubplot 对象在 0x53e2f310
我无法理解环境之间的这种差异。直到我print(IPython.sys_info())
在两个环境中运行命令。
在 CanopyIPython.sys_info()
返回:
{'commit_hash':'c433019','commit_source':'安装','default_encoding':'UTF-8','ipython_path':'/usr/local/Canopy/appdata/canopy-1.0.3.1262.rh5-x86_64 /lib/python2.7/site-packages/IPython','ipython_version':'1.0.dev','os_name':'posix','platform':'Linux-3.8.0-26-generic-x86_64-with -debian-wheezy-sid','sys_executable':'/home/kambiz/Enthought/Canopy_64bit/User/bin/python','sys_platform':'linux2','sys_version':'2.7.3 | 64 位 | (默认,2013 年 6 月 14 日,18:32:48)\n[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)]'}
在笔记本IPython.sys_info()
返回:
{'commit_hash':'177894e','commit_source':'安装','default_encoding':'UTF-8','ipython_path':'/home/kambiz/Enthought/Canopy_64bit/User/lib/python2.7/site -packages/IPython','ipython_version':'0.13.1','os_name':'posix','platform':'Linux-3.8.0-26-generic-x86_64-with-debian-wheezy-sid', 'sys_executable':'/home/kambiz/Enthought/Canopy_64bit/User/bin/python','sys_platform':'linux2','sys_version':'2.7.3 | 64 位 | (默认,2013 年 6 月 14 日,18:32:48)\n[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)]'}
我注意到 Ipython_path 指向 EPD 文件所在的不同路径,这些路径又指向不同版本的 ipython!!!我不确定这是怎么发生的,也不确定如何解决它。这样两个环境都运行相同的版本,以相同的方式执行代码。
IPython 0.13.1 版导致 matplotlib 失败的代码片段是:
import pylab as pl
...
fig, axes = pl.subplots(len(evokeds), sharex=True, sharey=True, tight_layout=True, figsize=(8, 11), dpi=100)
figname = (data_path + subj_queue[r] + '/' + subj_queue[r] + '_evokeds.pdf')
for evoked, ax, cond in zip(evokeds, axes.flatten(), ['Known', 'Known-ctrl', 'Unknown', 'Unkown-ctrl']):
evoked.plot(picks=mag_picks, axes=ax)
ax.set_title('%s' % cond)
fig.savefig(figname, format='pdf')
其中 evokeds 属于由第三方类函数mne.Epochs.average()list
生成的Evoked对象类。在 IPython 0.13.1 中导致 matplotlib 崩溃的绘图命令也是 mne 模块中的一个类函数mne.fiff.evoked.plot()。此处提供了一个公开可用的示例,该示例也将在带有 Ipython 0.13.1 的外部笔记本中生成相同的绘图问题。生成的错误是 KeyError:。这是子图的屏幕截图:evoked.plot(picks=mag_picks, axes=ax)
这是完整的追溯:
() 25 中的 KeyError Traceback (最近一次调用最后一次) figname = (data_path + subj_queue[r] + '/' + subj_queue[r] + '_evokeds.pdf') 26 用于诱发,ax in zip(evokeds,axes.flatten ()): ---> 27 evoked.plot(picks=mag_picks, axes=ax) 28 ax.set_title('%s' % cond) 29 fig.savefig(figname, format='pdf')
/usr/local/mne-python/mne/fiff/evoked.pyc in plot(self,picks,exclude,unit,show,ylim,proj,xlim,hline,units,scalings,titles,axes)396 plot_evoked(self, picks=picks,exclude=exclude,unit=unit,show=show,397 ylim=ylim,proj=proj,xlim=xlim,hline=hline,units=units,--> 398 scalings=scalings,titles=titles,axes =axes) 399 400 def plot_topomap(self, times=None, ch_type='mag', layout=None, vmax=None,
/usr/local/mne-python/mne/viz.pyc in plot_evoked(诱发、挑选、排除、单位、显示、ylim、proj、xlim、hline、单位、缩放、标题、轴)1213 1214 D = this_scaling * 诱发.data[idx, :] -> 1215 pl.axes(ax) 1216 ax.plot(times, DT) 1217 如果 xlim 不是 None:
/home/kambiz/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/pyplot.pyc in axes(*args, **kwargs) 650 651 if isinstance(arg, Axes): --> 652 a = gcf().sca(arg) 653 否则:654 rect = arg
/home/kambiz/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/figure.pyc in sca(self, a) 1196 def sca(self, a): 1197 '设置当前轴为a 并返回 a' -> 1198 self._axstack.bubble(a) 1199 for func in self._axobservers: func(self) 1200 return a
/home/kambiz/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/figure.pyc 在 bubble(self, a) 97 堆栈中,到顶部。98 """ ---> 99 return Stack.bubble(self, self._entry_from_axes(a)) 100 101 def add(self, key, a):
/home/kambiz/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/figure.pyc in _entry_from_axes(self, e) 85 86 def _entry_from_axes(self, e): ---> 87 ind, k = dict([(a, (ind, k)) for (k, (ind, a)) in self._elements])[e] 88 return (k, (ind, e)) 89
KeyError:matplotlib.axes.AxesSubplot 对象位于 0x56e401d0