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.
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
...
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.
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_()