Faire travailler PySide avec matplotlib

j'ai essayé de courir le exemple de code sur le site de SciPy, mais j'ai cette erreur:

Traceback (most recent call last):
  File ".matplotlibPySide.py", line 24, in <module>
    win.setCentralWidget(canvas)
TypeError: 'PySide.QtGui.QMainWindow.setCentralWidget' called with wrong argument types:
  PySide.QtGui.QMainWindow.setCentralWidget(FigureCanvasQTAgg)
Supported signatures:
  PySide.QtGui.QMainWindow.setCentralWidget(PySide.QtGui.QWidget)

je construis un simple enregistreur de données scientifiques qui sera éventuellement utilisé dans des applications commerciales, donc j'ai vraiment besoin à la fois de la LGPL de PySide et de la fonctionnalité de pointage. Est-ce que quelqu'un a de l'expérience sur la façon d'obtenir ce travail ou des paquets de traçage alternatifs ou des idées?

Merci d'avance.

21
demandé sur jbbiomed 2011-07-17 15:28:57

3 réponses

L'exemple que vous citez:

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

fonctionne, mais vous pourriez avoir besoin de suggérer l'utilisation de PySide:

...
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
import pylab
...
31
répondu dsign 2011-11-28 08:05:25

j'avais des objectifs similaires (LGPL, utilisation commerciale potentielle) et voici comment j'ai fini par le faire fonctionner.

créer un widget matplotlib (voir ici pour plus de détail sur l'un de 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)

Dans Qt Designer, j'ai créé un vide widget de tenir mon intrigue et puis, quand j' __init__ la fenêtre principale que j'appelle 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)

puis j'appelle plotDataPoints au besoin:

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

Note: Ceci efface et redessine toute l'intrigue le temps (puisque la forme de mes données ne cesse de changer) et n'est donc pas rapide.

5
répondu akehrer 2012-09-20 14:46:01

je pense que vous avez peut-être posté ceci sur la liste de diffusion matplotlib. Mais juste au cas où quelqu'un d'autre cherche la réponse. La meilleure option est d'utiliser la branche principale sur GitHub, mais si vous ne pouvez pas ou ne savez pas comment travailler la version Github, vous pouvez utiliser le code suivant pour rendre un tracé dans 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_()
2
répondu Gerald 2011-08-02 02:00:28