[ 已解决 ]matplotlib-tk 不显示

我想用scipy做点工作,有时候要画个图,所以需要使用matplotlib
但是我机器上的matplotlib-tk不知道为什么,怎么都调用不了,不显示图像,请版上各位给出出主意,该怎么解决。
实例如下:
使用ipython
·[1] : import matplotlib.pyplot as plt
[2] : x = [1,2,3,4,5]
[3] : y = [1,4,9,16,25]
[4] : plt.plot(x,y)
[5] : plt.show()

但是没有任何图作出来,也没有报错,out[4] : <matplotlib.lines.Line2D at 0x3970190>].
这是正常输出的结果,就是图是做出来了。

我尝试能不能把图保存
[6] : from matplotlib.pyplot import savefig
[7] : savefig(‘save.png’)

在当前目录下得到了我想要的图,这说明matplotlib都是没问题的,但是matplotlib-tk没有调用和显示,我不知道怎么调整,
请各位同学帮忙给个建议。

1赞

我研究了一下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。

我看了一下确实没有 windowing.py
但是貌似是被特意移除的。在一个 bug 报告里看到有人评论说在移除 windowing.py 之后需要修复另外一个文件。

bugzilla.novell.com/show_bug.cgi?id=863451

谢谢你的这个链接。看来不用报 bug 了,已经有人报了,看时间是 2014-02-14,回复是 19 号,距现在时间也一个月了。其中一个人在 12.3 里发现了相同的问题。他们觉得要想交互的使用 matplotlib 应该把 winodwing.py 放进包里。

我在其他的英文论坛里,看到有人说是包管理的问题,可以自己重新 setup 一下。我现在是从别处 copy 了一个 windowing.py 过来应一下急。现在手头有工作,等等官方的修正,实在不行再折腾吧。这一帖等有了结果再最后回应。

我大致扫了一下,感觉从其中的回复看,是故意去掉 windowing.py 的吧? 不过我确实没仔细看。

很明显是打包那人犯二把 windowing 当作 windows,跟 cocca 和 macosx 的 backend 一起排除掉了,因为他觉得 Linux 上用不到。

build.opensuse.org/request/show/226376