2015-09-17 5 views
1

Привет, я пытаюсь добавить собственный график к интерфейсу pyqt, который у меня есть. Он не показывает никаких данных, но показывает график matplotlib-заполнителя. Любая помощь?! Также, если я рисую только данные графа, не помещая его в PYQT, он появляется. Благодаря!PYQT и встраивание matplotlib: График не отображается

class MyMplCanvas(FigureCanvas): 
"""Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" 
def __init__(self, parent=None, width=5, height=4, dpi=100): 
    fig = Figure(figsize=(width, height), dpi=dpi) 
    #self.axes = fig.add_subplot(111) 
    # We want the axes cleared every time plot() is called 
    self.axes.hold(False) 

    self.compute_initial_figure() 
    FigureCanvas.__init__(self, fig) 
    self.setParent(parent) 

    FigureCanvas.setSizePolicy(self, 
           QtGui.QSizePolicy.Expanding, 
           QtGui.QSizePolicy.Expanding) 
    FigureCanvas.updateGeometry(self) 

def compute_initial_figure(self): 
    pass 


class MyStaticMplCanvas(MyMplCanvas): 

def mystatic(self, parent=None): 
    super(MyStaticMplCanvas, self).__init__(parent) 

    rate,data = read('test.wav') # reading 
    subplot(411) 
    self.plot(range(len(data)),data) 
    subplot(412) 
    self.specgram(data, NFFT=128, noverlap=0) # small window 
    subplot(413) 
    self.specgram(data, NFFT=512, noverlap=0) 
    subplot(414) 
    self.specgram(data, NFFT=1024, noverlap=0) # big window 

    self.show() 


class ApplicationWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     l = QtGui.QVBoxLayout(self.main_widget) 
     sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100) 

     l.addWidget(sc) 

ответ

2

В примере кода вы предоставили, не призыв к mystatic метода, который используется для построения данных. Поэтому на вашей фигуре ничего не отображается.

Кроме того, кажется вы используете интерфейс pyplot для построения данных по телефону непосредственно subplot и plot, например, в mystatic. При встраивании фигуры mpl в приложение рекомендуется с mpl documentation придерживаться объектно-ориентированного API.

Я подготовил минимальный рабочий пример из кода, который вы предоставили, который соответствует рекомендациям, приведенным в вышеупомянутой документации. Надеюсь, поможет.

from PyQt4 import QtGui 
import sys 
import numpy as np 
import matplotlib as mpl  
mpl.use('Qt4Agg') 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 

class MyMplCanvas(FigureCanvas): 
    def __init__(self, parent=None, width=5, height=4, dpi=100):   
     fig = mpl.figure.Figure(figsize=(width, height), dpi=dpi) 
     fig.set_tight_layout('tight') 
     super(MyMplCanvas, self).__init__(fig) 

class MyStaticMplCanvas(MyMplCanvas): 

    def mystatic(self, parent=None): 

     x, y = np.random.rand(50), np.random.rand(50) 
     ax1 = self.figure.add_subplot(411) 
     ax1.plot(x,y, '.') 
     ax2 = self.figure.add_subplot(412) 
     ax2.plot(x,y, '.') 
     ax3 = self.figure.add_subplot(413) 
     ax3.plot(x,y, '.') 
     ax4 = self.figure.add_subplot(414) 
     ax4.plot(x,y, '.') 

if __name__ == '__main__' : 

    app = QtGui.QApplication(sys.argv) 

    w = MyStaticMplCanvas(width=5, height=6, dpi=100) 
    w.mystatic() 
    w.show() 

    sys.exit(app.exec_()) 

что приводит:

enter image description here

+0

Благодаря человеку попробовать это в ближайшее время! – Anekdotin

Смежные вопросы