Plot con pyqt4 y qwt5 primera parte

Python es un lenguaje de programación interpretado muy fácil de aprender y de utilizar, con una gran cantidad de módulos que nos permiten hacer casi cualquier cosa.
En este ejemplo, se muestra como crear una interfaz grafica sencilla hecha en Qt en conjunto con la librería qwt para hacer un grafico de una onda senoidal que podamos manipular. Elegí qwt sobre matplotlib, por que para graficas en tiempo real, es mucho mas rapida la libreria qwt que matplotlib.

Lo que debe hacer la grafica es lo siguiente:

    Dibujar una onda seno y una onda coseno.
    Tener limites el eje X de [0,100] y en el eje Y de [-100,100].

Este ejemplo es de referencia para futuros proyectos.

Por comodidad hice la plantilla en qt designer, utilizando un widget vertical layout como contenedor de la gráfica. Para que el código creado en qt designer pueda ser usado en python, se utiliza pyuic que viene incluido en el paquete PyQt. Con esta línea

pyuic4 -o nombredelarchivodesalida.py nombredelarchivo.ui

el archivo con extension ui es el que se crea en qt designer y se obtiene un archivo de salida que puede ser utilizado en python.

La plantilla de la ventana es la siguiente:

Le quite el tool bar y el status bar. El cuadro rojo es del vertical layout donde se inserta el grafico.
Para poder utilizar la interfaz hecha en qt designer, la importamos como si fuera un modulo:

  1. from Ui_ejemploqwt_ui import Ui_MainWindow

Primero creamos el marco donde se dibujarán todos los elementos que incluyamos en la gráfica, esta clase se llama qwtplot. Esto se hace con la siguiente función:

  1. def createPlot(self, color):
  2.     #en esta parte se crea el plot que seria todo el marco y los numeros "el cascaron"
  3.     plot = Qwt.QwtPlot()
  4.     plot.setCanvasBackground(QtGui.QColor("black"))
  5.     plot.setAxisTitle(Qwt.QwtPlot.xBottom, 'X Axis')
  6.     plot.setAxisTitle(Qwt.QwtPlot.yLeft, 'Y Axis')
  7.     plot.setAxisScale(Qwt.QwtPlot.xBottom, 0, 100)
  8.     plot.setAxisScale(Qwt.QwtPlot.yLeft, -100, 100,10)
  9.     plot.setAxisAutoScale(Qwt.QwtPlot.xBottom)

Corremos el programa y obtenemos la siguiente ventana:


Ahora graficaremos la función de la onda senoidal, esto se hace con el objeto qwtCurve, que representa los datos con las coordenadas X,Y de la función. Creamos el objeto qwtCurve: 

  1. #creation of the curve
  2.     curve = Qwt.QwtPlotCurve('')
  3.     curve.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased)
  4.     pen = QtGui.QPen(QtGui.QColor(color))
  5.     pen.setWidth(2)
  6.     curve.setPen(pen)
  7.     curve.attach(plot)

la variable color corresponde a cualquiera de los colores predefinidos de Qt. Despues creamos los valores de la onda seno y los asignamos objeto QtCurve:

  1. #this creates the sin wave, and pass the data x to the curve
  2. x = arange(0.0, 100,0.1)
  3. # initialize the data
  4. curve.setData(x, 100*sin(x/7))

Ejecutando el programa:

Si queremos graficar una segunda función dentro del mismo objeto plot, creamos un segundo objeto curve:

  1. curve2 = Qwt.QwtPlotCurve('')
  2. curve2.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased)
  3. pen = QtGui.QPen(QtGui.QColor("yellow"))
  4. pen.setWidth(2)
  5. curve2.setPen(pen)
  6. curve2.attach(plot)

así obtendremos la siguiente ventana:

El programa completo queda así:

  1. import sys
  2. from PyQt4 import QtCore, QtGui,  Qt
  3. from Ui_ejemploqwt_ui import Ui_MainWindow
  4. import PyQt4.Qwt5 as Qwt
  5. from PyQt4.Qwt5.anynumpy import *
  6.  
  7.  
  8. class testAnalogUI(QtGui.QMainWindow)
  9.   
  10.     def __init__(self, parent=None):
  11.         QtGui.QWidget.__init__(self, parent)
  12.         self.ui = Ui_MainWindow()
  13.         self.ui.setupUi(self)
  14.         self.plotX= self.createPlot('green')
  15.  
  16.         #add the plot widget to the vertical layout created in qtdesigner
  17.         self.ui.vlEjeX.addWidget(self.plotX)       
  18.   
  19.     def createPlot(self, color):
  20.         #en esta parte se crea el plot que seria todo el marco y los numeros "el cascaron"
  21.         plot = Qwt.QwtPlot()
  22.         plot.setCanvasBackground(QtGui.QColor("black"))
  23.         plot.setAxisTitle(Qwt.QwtPlot.xBottom, 'X Axis')
  24.         plot.setAxisTitle(Qwt.QwtPlot.yLeft, 'Y Axis')
  25.         plot.setAxisScale(Qwt.QwtPlot.xBottom, 0, 100)
  26.         plot.setAxisScale(Qwt.QwtPlot.yLeft, -100, 100,10)
  27.         plot.setAxisAutoScale(Qwt.QwtPlot.xBottom)
  28.                
  29.         #creation of the curve
  30.         curve = Qwt.QwtPlotCurve('')
  31.         curve.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased)
  32.         pen = QtGui.QPen(QtGui.QColor(color))
  33.         pen.setWidth(2)
  34.         curve.setPen(pen)
  35.         curve.attach(plot)
  36.       
  37.         curve2 = Qwt.QwtPlotCurve('')
  38.         curve2.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased)
  39.         pen = QtGui.QPen(QtGui.QColor("yellow"))
  40.         pen.setWidth(2)
  41.         curve2.setPen(pen)
  42.         curve2.attach(plot)
  43.           
  44.         #this creates the sin wave, and pass the data x to the curve
  45.         x = arange(0.0, 100,0.1)
  46.        
  47.         # initialize the data
  48.        
  49.         curve.setData(x, 100*sin(x/7))
  50.         curve2.setData(x, 100*cos(x/7))
  51.                       
  52.     return plot
  53.  
  54.     #createPlot()
  55.  
  56. if __name__ == "__main__":
  57.     app = QtGui.QApplication(sys.argv)
  58.     myapp = testAnalogUI()
  59.     myapp.show()
  60.     sys.exit(app.exec_())

Descargar código fuente.

2 comentarios:

Sandra dijo...
Este comentario ha sido eliminado por el autor.
Sandra dijo...

quiero hacer el ejemplo pero no se como llamar cuando lo creo en qt designer, me gustaria que me explique un ejemplo especifico con los nombres que pongo para no confundirme

Publicar un comentario