import matplotlib.pyplot as plt报错

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']

这次就没有问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值