2011-07-17 9 views
21

çalışmasını sağlama: Sonunda ticari uygulamalarda kullanılacak basit bir bilimsel veri kaydedici inşa ediyorumPyside ben <a href="http://www.scipy.org/Cookbook/Matplotlib/PySide" rel="noreferrer">example code on the SciPy website</a> çalışan denedi, ama bu hatayı alıyorum matplotlib

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) 

, bu yüzden gerçekten ihtiyacım Her iki LGPL PySide ve çizim işlevselliği. Herkesin işe yarayacağı ya da alternatif komplo paketleri veya fikirleri nasıl elde edeceği konusunda tecrübesi var mı?

Şimdiden teşekkürler.

+1

Örnek kodun orada atlanmasını deneyin ve en son matplotlib git ipucuna sahip olan öğeleri deneyin. https://github.com/matplotlib/matplotlib (Çeşitli yapı bağımlılıklarına sahip olmanız gerektiğini unutmayın. Saf python değil.) Tam PySide desteği bir ay veya daha uzun bir süre önce qt arka ucuna eklendi, ancak henüz bir sürümde çıkın. Beğendiğiniz kod sadece bir çözümdür. Matplotlib'in yeni sürümleri tamamen pyside destek verecektir. –

cevap

2

Bunu matplotlib posta listesine yazmış olabilirsiniz. Ama sadece başka biri cevabı arıyorsa. En iyi seçenek, ana dalı Github'da kullanmaktır, ancak Github sürümünün nasıl çalıştığını bilmiyorsanız ya da bilmiyorsanız, PySide'de bir çizim oluşturmak için aşağıdaki kodu kullanabilirsiniz.

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

Sözünü örnek:

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

eser, ancak PySide kullanımını önermek gerekebilir:

... 
matplotlib.use('Qt4Agg') 
matplotlib.rcParams['backend.qt4']='PySide' 
import pylab 
... 
+0

http://www.scipy.org/Cookbook/Matplotlib/PySide örneğinde, niçin 'import pylab' var? bu çizgi olmadan iyi çalışıyor. – JuanPablo

+2

@JuanPablo Pileb'i içe aktarmaya gerek yok, ancak Matlablotlib'i pylab veya pyplot'u almadan önce mümkün olduğunca yapılandırmanız gerektiğini düşünüyorum ... – dsign

5

vardı benzer hedefler (LGPL, potansiyel ticari kullanım) ve işte işe nasıl başladım.

bir matplotlib widget'ı (PyQt'de için daha ayrıntılı bir biri için here bakınız) oluşturun: Ben komplo tutmak için boş bir widget oluşturduk ve ben ana penceresini __init__ zaman sonra setupPlot diyoruz

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 olarak :

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) 

Sonra gerektiği gibi plotDataPoints diyoruz:

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

Not: Bu, her defasında tüm grafiği temizler ve yeniden çizer (verilerimin şekli değiştiği için) ve bu nedenle hızlı olmaz.

İlgili konular