Ответ 1
Пример, который вы упомянули:
http://www.scipy.org/Cookbook/Matplotlib/PySide
работает, но вам может потребоваться использование PySide:
...
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
import pylab
...
Я попытался запустить пример на веб-сайте SciPy, но я получаю эту ошибку:
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)
Я создаю простой научный регистратор данных, который в конечном итоге будет использоваться в коммерческих приложениях, поэтому мне действительно нужны как LGPL от PySide, так и функции построения графиков. Есть ли у кого-нибудь опыт в том, как заставить это работать или альтернативные планы или идеи создания пакетов?
Спасибо заранее.
Пример, который вы упомянули:
http://www.scipy.org/Cookbook/Matplotlib/PySide
работает, но вам может потребоваться использование PySide:
...
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
import pylab
...
У меня были аналогичные цели (LGPL, потенциальное коммерческое использование), и вот, как я в итоге начал работать.
Создайте виджет matplotlib (см. здесь для более подробного описания для 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)
В Qt Designer я создал пустой виджет для хранения моего графика, а затем, когда я __init__
в главном окне, я вызываю 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)
Затем я вызываю plotDataPoints по мере необходимости:
def plotDataPoints(self,x,y):
self.DataPlot.axes.clear()
self.DataPlot.axes.plot(x,y,'bo-')
self.DataPlot.draw()
Примечание. Это очищает и перерисовывает весь график каждый раз (поскольку форма моих данных продолжает меняться), и поэтому не быстро.
Я думаю, вы, возможно, разместили это в списке рассылки matplotlib. Но на всякий случай кто-то ищет ответ. Лучше всего использовать мастер-ветвь в Github, но если вы не можете или не знаете, как работать с версией Github, вы можете использовать следующий код для отображения графика в 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_()