Getting PySide to work with matplotlib

前端 未结 3 604
暖寄归人
暖寄归人 2020-12-05 01:19

I have tried running the example code on the SciPy website, but I get this error:

Traceback (most recent call last):
  File \".\\matplotlibPySide.py\", line          


        
相关标签:
3条回答
  • 2020-12-05 01:28

    The example that you mention:

    http://www.scipy.org/Cookbook/Matplotlib/PySide

    works, but you might need to suggest the use of PySide:

    ...
    matplotlib.use('Qt4Agg')
    matplotlib.rcParams['backend.qt4']='PySide'
    import pylab
    ...
    
    0 讨论(0)
  • 2020-12-05 01:43

    I think you may have posted this on the matplotlib mailing list. But just in case someone else is looking for the answer. The best option is to use the master branch on Github, but if you can't or don't know how to work the Github version you can use the following code to render a plot in PySide.

    import numpy as np
    from matplotlib import use
    use('AGG')
    from matplotlib.transforms import Bbox
    from matplotlib.path import Path
    from matplotlib.patches import Rectangle
    from matplotlib.pylab import *
    from PySide import QtCore,QtGui
    
    rect = Rectangle((-1, -1), 2, 2, facecolor="#aaaaaa")
    gca().add_patch(rect)
    bbox = Bbox.from_bounds(-1, -1, 2, 2)
    
    for i in range(12):
        vertices = (np.random.random((4, 2)) - 0.5) * 6.0
        vertices = np.ma.masked_array(vertices, [[False, False], [True, True], [False, False], [False, False]])
        path = Path(vertices)
        if path.intersects_bbox(bbox):
            color = 'r'
        else:
            color = 'b'
        plot(vertices[:,0], vertices[:,1], color=color)
    
    app = QtGui.QApplication(sys.argv)
    gcf().canvas.draw()
    
    stringBuffer = gcf().canvas.buffer_rgba(0,0)
    l, b, w, h = gcf().bbox.bounds
    
    qImage = QtGui.QImage(stringBuffer, 
                          w,
                          h,
                          QtGui.QImage.Format_ARGB32)
    
    scene = QtGui.QGraphicsScene()
    view = QtGui.QGraphicsView(scene)
    pixmap = QtGui.QPixmap.fromImage(qImage)
    pixmapItem = QtGui.QGraphicsPixmapItem(pixmap)
    scene.addItem(pixmapItem)
    view.show()
    
    app.exec_()
    
    0 讨论(0)
  • 2020-12-05 01:44

    I had similar goals (LGPL, potential commercial use) and here's how I ended up getting it to work.

    Create a matplotlib widget (see here for a more detailed one for PyQt):

    import matplotlib
    
    matplotlib.use('Qt4Agg')
    matplotlib.rcParams['backend.qt4']='PySide'
    
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    
    class MatplotlibWidget(FigureCanvas):
    
        def __init__(self, parent=None,xlabel='x',ylabel='y',title='Title'):
            super(MatplotlibWidget, self).__init__(Figure())
    
            self.setParent(parent)
            self.figure = Figure()
            self.canvas = FigureCanvas(self.figure)
            self.axes = self.figure.add_subplot(111)
    
            self.axes.set_xlabel(xlabel)
            self.axes.set_ylabel(ylabel)
            self.axes.set_title(title)
    

    In Qt Designer I created a blank widget to hold my plot and then when I __init__ the main window I call setupPlot:

    def  setupPlot(self):
        # create a matplotlib widget
        self.DataPlot = MatplotlibWidget()
        # create a layout inside the blank widget and add the matplotlib widget        
        layout = QtGui.QVBoxLayout(self.ui.widget_PlotArea)        
        layout.addWidget(self.DataPlot,1)
    

    Then I call plotDataPoints as needed:

    def plotDataPoints(self,x,y):        
        self.DataPlot.axes.clear()
        self.DataPlot.axes.plot(x,y,'bo-')
        self.DataPlot.draw()
    

    Note: this clears and redraws the entire plot every time (since the shape of my data keeps changing) and so isn't fast.

    0 讨论(0)
提交回复
热议问题