我研究了一下matplotlib,基本上弄清楚是什么问题了。
为了适应各种用户的需求,matplotlib提供了多种输出类型的backend,用户端只需要应用好做图代码即frontend就可以。
backend有两类:一类是交互式的,如“GTKAgg, pygtk, wxpython, tkinter, Qt4, macosx等,这种backend可以
直接在屏幕上显示图像;另一类是,非交互式的,如”Agg, PS, pdf, svg, png等,这种backend支持我们熟悉的图片
格式,但不支持在屏幕上显示图像。查看电脑上matplotlib支持的backend模式,可以通过以下方式(在IPython中):
In [1] : import matplotlib
In [2] : print(matplotlib.rcsetup.all_backends)
‘GTK’, ‘GTKAgg’, ‘GTKCairo’, ‘MacOSX’, ‘Qt4Agg’, ‘TkAgg’, ‘WX’, ‘WXAgg’, ‘CocoaAgg’,
‘GTK3Cairo’, ‘GTK3Agg’, ‘WebAgg’, ‘agg’, ‘cairo’, ‘emf’, ‘gdk’, ‘pdf’, ‘pgf’, ‘ps’, ‘svg’, ‘template’]
以上就是我机器支持的backend模式。想交互的使用matplotlib,首先要知道自己matplotlib的backend设置,
In [3] : matplotlib.matplotlib_fname()
Out[3] : ‘/usr/lib64/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc’
查看以上文件中的backend设置,我的设置是backend : Agg,那么我无法看到图像就是正常的了,因为Agg是非交互的
backend,自然在屏幕上什么也看不到。我真正的问题来了,更改/usr/lib64/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc里的
backend 为TkAgg,调用matplotlib.pyplot就出现了以下问题:
In [1] : import matplotlib.pyplot as plt
ImportError Traceback (most recent call last)
in ()
----> 1 import matplotlib.pyplot as plt
/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py in ()
96
97 from matplotlib.backends import pylab_setup
—> 98 _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
99
100
/usr/lib64/python2.7/site-packages/matplotlib/backends/init.pyc in pylab_setup()
26 # imports. 0 means only perform absolute imports.
27 backend_mod = import(backend_name,
—> 28 globals(),locals(),[backend_name],0)
29
30 # Things we pull in from all backends
/usr/lib64/python2.7/site-packages/matplotlib/backends/backend_tkagg.py in ()
12
13 from matplotlib.backends.backend_agg import FigureCanvasAgg
—> 14 import matplotlib.backends.windowing as windowing
15
16 import matplotlib
ImportError: No module named windowing
很明显问题是缺少windowing这个module,我查找了一些英文论坛,发现有人遇到过类似的问题,说有些包管理在安装
matplotlib并没有安装完全所有module。我在/usr/lib64/python2.7/site-packages/matplotlib/backends/
中的确没有找到windowing.py. 我安装Ipython时,python-matplotlib和python-matplotlib-tk由依赖安装,
我反复安装了多次,安装没出错但是问题依旧。
首先声明,以下是找问题,不是解决方法。我从一台matplotlib正常的debian上相应的backends中复制windowing.py
到opensuse13.1中的backends中,再import matplotlib.pyplot as plt,没有报错了,也可以在屏幕上显示图片了。
我不知道为什么,windowing.py没有被安装进来,所以请版上的同学和高手,给个解决方案,是自己编译matplotlib还是
有必要向opensuse官方报bug。