Matplotlib 3.0.0及以上版本因backend问题不能显示图片及解决

UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure. % get_backend())

问题背景

最近在练习的时候,需要用matplotlib画图观察数据集,但是图象无法显示,调用fig.show()方法也不能显示图象。代码如下
环境:python 3.6.3
ide:spyder 3.3.4
matplotlib 版本: 3.0.0

import matplotlib
import matplotlib.pyplot as plt

matrix1,labels = file2matrix(r'../machine learning/machinelearninginaction-master/Ch02/datingTestSet.txt',)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(matrix1[:,1],matrix1[:,2])
fig.show()
        

报错提示:UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure. % get_backend())

问题解决

  1. stackoverflow上有回答说是因为matplotlib 3.0.0 包中间有bug,升级到更高版本或者降级到2.2.3版本就可以解决问题。但是我将matplotlib升级到3.1.0,还是不能显示图象;又把包降回2.2.3,依然不显示图象。
  2. 所以,只能接着研究报错信息,报错信息说matplotlib包用的是后端是ipykernel.pylab.backend_inline,这个后端不支持在编译器前端显示。为了支持所有的使用情形,matplotlib能够产生不同的输出,而把每一个不同输出的能力叫做一个后端。而前端就是用户需要处理的代码,如绘图代码,然后后端做的就是所有看不到的辛苦工作来生成视图窗口。这里有两种不同类型的后端:

1.用户接口后端(又叫做"交互式后端",如pygtk, wxpython, thinter,qt, macosx或者fltk)。
2.硬拷贝后端,也叫做非交互式后端,用来生成图像文件(PNG,SVG,PDF, PS)

所以matplotlib不显示图象就是当前的用户接口后端不支持前端显示并交互,所以我们需要自己配置。
有两种方式配置你的后端。

  1. 在matplotlibrc文件中设置后端参数
  2. 另外一种方式是使用matplotlib的use()命令。 调用use()方法必须在import matplotlib.pyplot或者matplotlib.pylab之前设置
    可以使用的后端有 [‘GTK3Agg’, ‘GTK3Cairo’, ‘MacOSX’, ‘nbAgg’, ‘Qt4Agg’, ‘Qt4Cairo’, ‘Qt5Agg’, ‘Qt5Cairo’, ‘TkAgg’, ‘TkCairo’, ‘WebAgg’, ‘WX’, ‘WXAgg’, ‘WXCairo’, ‘agg’, ‘cairo’, ‘pdf’, ‘pgf’, ‘ps’, ‘svg’, ‘template’]

这里我选择的是 ‘Qt5Agg’,设置完之后调用fig.show()就可以显示图片了

import matplotlib
matplotlib.use('Qt5Agg')#必须显式指明matplotlib的后端
import matplotlib.pyplot as plt

matrix1,labels = file2matrix(r'../machine learning/machinelearninginaction-master/Ch02/datingTestSet.txt',)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(matrix1[:,1],matrix1[:,2])
fig.show()

Matplotlib 3.0.0及以上版本因backend问题不能显示图片及解决_第1张图片

你可能感兴趣的:(matplotlib,python)