import matplotlib.pyplot as plt报错。
错误信息:
Traceback (most recent call last):
File "", line 2, in <module>
from matplotlib import pyplot as plt
File "", line 114, in <module>
_backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\__init__.py", line 32, in pylab_setup
globals(),locals(),[backend_name],0)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 18, in <module>
from .backend_qt5agg import FigureCanvasQTAggBase as _FigureCanvasQTAggBase
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 16, in <module>
from .backend_qt5 import QtCore
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt5.py", line 31, in <module>
from .qt_compat import QtCore, QtGui, QtWidgets, _getSaveFileName, __version__
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\qt_compat.py", line 139, in <module>
from PyQt4 import QtCore, QtGui
ModuleNotFoundError: No module named 'PyQt4'
问题出在qt_compat.py文件
错误提示找不到PyQt4,直观解决方法是安装PyQt4包,但是在cmd和anaconda下都没有pyqt4。所以只能强制改qt_compat.py文件中的代码了。
基本矛盾是:anaconda环境下默认配置了PyQt5,而matplotlib默认调用PyQt4,即版本问题
原qt_compat.py文件:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from matplotlib.externals import six
import os
import sys
from matplotlib import rcParams, verbose
# Available APIs.
QT_API_PYQT = 'PyQt4' # API is not set here; Python 2.x default is V 1
QT_API_PYQTv2 = 'PyQt4v2' # forced to Version 2 API
QT_API_PYSIDE = 'PySide' # only supports Version 2 API
QT_API_PYQT5 = 'PyQt5' # use PyQt5 API; Version 2 with module shim
....
....
if QT_API is None:
# No ETS environment or incompatible so use rcParams.
if rcParams['backend'] == 'Qt5Agg':
QT_API = rcParams['backend.qt5']
elif rcParams['backend'] == 'Qt4Agg':
QT_API = rcParams['backend.qt4']
else:
在原代码中加入一句rcParams[‘backend’]=‘Qt5Agg’,把默认环境改成pyqt5.
改成:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from matplotlib.externals import six
import os
import sys
from matplotlib import rcParams, verbose
# Available APIs.
QT_API_PYQT = 'PyQt4' # API is not set here; Python 2.x default is V 1
QT_API_PYQTv2 = 'PyQt4v2' # forced to Version 2 API
QT_API_PYSIDE = 'PySide' # only supports Version 2 API
QT_API_PYQT5 = 'PyQt5' # use PyQt5 API; Version 2 with module shim
rcParams['backend']='Qt5Agg' ###多加了这一句话
....
....
if QT_API is None:
# No ETS environment or incompatible so use rcParams.
if rcParams['backend'] == 'Qt5Agg':
QT_API = rcParams['backend.qt5']
elif rcParams['backend'] == 'Qt4Agg':
QT_API = rcParams['backend.qt4']
else:
改完之后这个错没有了,但是有了新的问题:
Traceback (most recent call last):
File "D:/deeplearning/CNN/chengxu/ti.py", line 8, in <module>
plt.xlim(-11,11)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\pyplot.py", line 1582, in xlim
ax = gca()
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\pyplot.py", line 936, in gca
return gcf().gca(**kwargs)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\pyplot.py", line 586, in gcf
return figure()
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\pyplot.py", line 535, in figure
**kwargs)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 46, in new_figure_manager
return new_figure_manager_given_figure(num, thisFig)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 53, in new_figure_manager_given_figure
canvas = FigureCanvasQTAgg(figure)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 76, in __init__
FigureCanvasQT.__init__(self, figure)
File "D:\anaconda3\envs\py36\lib\site-packages\matplotlib\backends\backend_qt4.py", line 71, in __init__
QtWidgets.QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'figure'
这个错误的原因是在pyplot.py里边的也用到了rcParams,所以也需要加上rcParams[‘backend’]=‘Qt5Agg’
原pyplot.py:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from matplotlib.externals import six
import sys
import warnings
import types
from cycler import cycler
import matplotlib
...
from matplotlib import rcParams, rcParamsDefault, get_backend
...
from .ticker import TickHelper, Formatter, FixedFormatter, NullFormatter,\
FuncFormatter, FormatStrFormatter, ScalarFormatter,\
LogFormatter, LogFormatterExponent, LogFormatterMathtext,\
Locator, IndexLocator, FixedLocator, NullLocator,\
LinearLocator, LogLocator, AutoLocator, MultipleLocator,\
MaxNLocator
## Backend detection ##
def _backend_selection():
""" If rcParams['backend_fallback'] is true, check to see if the
current backend is compatible with the current running event
loop, and if not switches to a compatible one.
"""
backend = rcParams['backend']
加上rcParams[‘backend’]='Qt5Agg’之后改为:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from matplotlib.externals import six
import sys
import warnings
import types
from cycler import cycler
import matplotlib
...
from matplotlib import rcParams, rcParamsDefault, get_backend
...
from .ticker import TickHelper, Formatter, FixedFormatter, NullFormatter,\
FuncFormatter, FormatStrFormatter, ScalarFormatter,\
LogFormatter, LogFormatterExponent, LogFormatterMathtext,\
Locator, IndexLocator, FixedLocator, NullLocator,\
LinearLocator, LogLocator, AutoLocator, MultipleLocator,\
MaxNLocator
## Backend detection ##
rcParams['backend']='Qt5Agg'
def _backend_selection():
""" If rcParams['backend_fallback'] is true, check to see if the
current backend is compatible with the current running event
loop, and if not switches to a compatible one.
"""
backend = rcParams['backend']
这次就没有问题了。