Search code examples
pythonmatplotlibpyside2

How do you display a figure in matplotlib using PySide2?


I am trying to learn matplotlib and I tried testing the following code.

import matplotlib
from matplotlib.figure import Figure  
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as     FigureCanvas
import sys
from PySide2 import QtGui   

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    wid = QtGui.QWidget()
    wid.resize(250, 150)
    grid = QtGui.QGridLayout()
    wid.setLayout(grid)
    fig = Figure(figsize=(7,5), dpi=65, facecolor=(1,1,1), edgecolor=(0,0,0))
    canvas = FigureCanvas(fig)
    grid.addWidget(canvas)
    wid.show()

However it seems like it doesn't recognize the signature of Figure.

TypeError: 'PySide2.QtGui.QGridLayout.addWidget' called with wrong argument types:
PySide2.QtGui.QGridLayout.addWidget(FigureCanvasQTAgg) Supported signatures:
PySide2.QtGui.QGridLayout.addWidget(PySide2.QtGui.QWidget, int, int, PySide2.QtCore.Qt.Alignment = 0)
PySide2.QtGui.QGridLayout.addWidget(PySide2.QtGui.QWidget, int, int, int, int, PySide2.QtCore.Qt.Alignment = 0)


Solution

  • PySide2 is a binding of Qt5 so you must use backend_qt5agg instead ofbackend_qt4agg, on the other hand it is advisable to import the backend (PySide2 in this case) before matplotlib so that matplotlib configures it internally, in addition to QApplication, QWidget and QGridLayout belong to QtWidgets since Qt5 separates them from QtGui and finally when you add a widget to QGridLayout you must indicate its position in the following parameters.

    Considering the above the solution is

    import sys
    
    from PySide2 import QtWidgets
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    
    
    if __name__ == "__main__":
    
        app = QtWidgets.QApplication(sys.argv)
        wid = QtWidgets.QWidget()
        wid.resize(250, 150)
        grid = QtWidgets.QGridLayout(wid)
        fig = Figure(figsize=(7, 5), dpi=65, facecolor=(1, 1, 1), edgecolor=(0, 0, 0))
        canvas = FigureCanvas(fig)
        grid.addWidget(canvas, 0, 0)
        wid.show()
        sys.exit(app.exec_())