Está en la página 1de 4

053-056_Mathlab_linux11

11.10.2005

10:31

Uhr

Pgina

53

Matplotlib DESARROLLO

Representacin grfica 2D

MATPLOTLIB

Actualmente existen numerosas herramientas para analizar datos y representarlos en grficas 2D, quizs una de las ms conocidas sea matlab debido a su sencillez de uso. Entre uno de sus numerosos usuarios, cabe destacar a John Hunter, quien ha desarrollado Matplotlib (biblioteca escrita principalmente en python) como una alternativa gratuita, sencilla y de calidad. POR JOS ANTONIO GARCA Y ANA FERREIRO

atplotlib es una biblioteca escrita en puro python, que hace un uso intensivo de Numeric/ numarray y otras extensiones para proporcionar un buen manejo de grandes arrays, permitiendo: crear grficas de calidad (suavizado de fuentes), interaccionar con el rea grfica (zoom, traslacin, etc), guardar figuras en diferentes formatos (.png, postcript), embeber el rea grfica en diferentes toolkits para el desarrollo de GUIs (GTK, WxPython y Tkinter), etc. En lo que sigue, veremos una serie de ejemplos, abordando las principales caractersticas de Matplotlib.

Listado 1: Capturas en diferentes formatos s01


02 ext=['.png','.eps','.ps','.svg '] s='fig' for k in range(0,3): y=sin((k+1)*pi*x) plot(x,y) name_fich=s+str(k)+ext[1] savefig(name_fich) hold(False) x=arange(0,2,0.1)

Instalacin
Para poder realizar todas las pruebas que se van proponiendo y las que a vosotros se os ocurran, es necesario tener instalado Python y Matplotlib. En la pagina web [1] se detallan los pasos a seguir en la instalacin, as como las diferentes opciones para configurar matplotlib.

03 04 05 06 07 08 09

Primeras grficas
Aunque matplotlib dispone de una API de orientacin de objetos, el principal modo para crear grficas es a travs de la interfaz de pylab, que se importa mediante,

WWW.LINUX- MAGAZINE.ES

Nmero 11

53

053-056_Mathlab_linux11

11.10.2005

10:32

Uhr

Pgina

54

DESARROLLO Matplotlib

Figura 1: Grfica dentro de una interface de usuario GTKAgg interactiva.

from pylab import *

En una misma figura podemos dibujar varias grficas simultneamente, esto se controla mendiante el comando hold. Por defecto, sobre una figura se pueden superponer grficas (hold(True)); si queremos que la grfica se borre ante un nuevo comando de plot, basta indicarlo mediante hold(False). Probad las siguientes lneas de cdigo,

Figura 2: Varias grficas en la misma figura.

Hay dos modos de trabajar en la interfaz de pylab: interactivamente o mediante scripts. Veremos ambos. Pongmonos manos a la obra Para dibujar la funcin coseno basta escribir en el interprete de Python las siguientes lneas:
>>> >>> >>> >>> >>> >>> >>> >>> from pylab import * t=arange(0.,2.*pi,0.1) s=cos(t) plot(t,s) xlabel("x") ylabel("cos") title("Mi primera grafica") show()

>>> from pylab import * >>> t=arange(0.,2.*pi,0.1) >>> s=cos(t) >>> p1=plot(t,s, 'g-o',U linewidth=2) >>> x=sqrt(t) >>> p2=plot(t,x, 'r--',U linewidth=3) >>> y=sin(t) >>> p3=plot(t,y, 'b--d') >>> show()

filas y una columna, tenis que escribir subplot(311) para crear la parte superior, subplot(312) para crear la grfica central, y subplot(313) para crear la grfica inferior. Vemoslo mejor con el siguiente ejemplo (Figura 3),
01 >>> subplot(311) 02 >>> plot(t,y,'b-d') 03 >>> ylabel('sin') 04 >>> subplot(312) 05 >>> plot(t,x,'r--',lin width=3) 06 >>> ylabel('sqrt') 07 >>> subplot(313) 08 >>> plot(t,s,'g-o',lin width=2) 09 >>> ylabel('cos') 10 >>> show()

Con el comando plot(t,x) se crea la grfica de t frente a s; mientras que mediante show() se abre una GUI interactiva (Figura 1) que contiene a la grfica. Tened en cuenta que el tipo de ventana va a depender el toolkit de GUI que tengis por defecto en el fichero de configuracin de matplotlib, en nuestro caso la ventana es de GTK. Con los comandos xlabel, ylabel y title etiquetamos los ejes x e y de la grfica y escribimos el ttulo de la misma, respectivamente. Por defecto la grfica se representa en lnea continua, a no ser que modifiquemos sus propiedades

Ahora tenemos tres grficas en la misma figura (Figura 2). Escribid hold(False) despus de la primera grfica p1. Qu ocurre? Slo se dibuja la ltima grfica p3. Si queremos que se representen en la misma figura las grficas p2 y p3, es necesario indicarlo mediante hold(True) despus de p2. En el cdigo previo, con los diferentes comandos plot, se representan las grficas en diferentes tipos. La grfica p1 se dibuja en color verde en lnea continua y marcas de puntos (g-o); p2 es la lnea roja discontinua (r--) y p3 se muestra en color azul en lnea discontinua con marcas de diamantes (b--d). Mediante linewidth controlamos el ancho de la lnea. En la pgina de matplotlib se detallan todas las propiedades de una lnea.

Puede suceder que el tipo de estructura proporcionada por subplot no sea lo que queremos, en este caso hay que emplear el comando axes para situar las diferentes grficas dentro de la figura en las posiciones que le indiquis. El comando axes se inicializa

Subgrficas
En una figura es posible representar diferentes grficas en una estructura de malla regular numFilas por numColumnas. Por ejemplo, para crear tres

Figura 3: Subgrficas estructuradas en una malla 3 x 1.

Figura 4: Uso del comando axes para colocar una grfica sobre otra.

54

Nmero 11

WWW.LINUX- MAGAZINE.ES

053-056_Mathlab_linux11

11.10.2005

10:32

Uhr

Pgina

55

Matplotlib DESARROLLO

de velocidades v, por ejemplo; es decir,


1. 2. 0.4 0.35 0.65 0.34

Figura 5: Puntos cargados desde un fichero.

con un rectngulo [izq,fondo,ancho,alto] en coordenadas relativas normalizadas (0,1). izq, fondo = (0,0) es el punto inferior a la izquierda del canvas de la figura. Escribid las siguientes lneas,
01 >>> x=arange(-2.,2.1,0.1) 02 >>> y=x**2 03 >>> plot(x,y,'b-d') 04 >>> axis([-2.1,2.1,-0.1,4.1]) 05 >>> xlabel('X') 06 >>> ylabel('Y=X**2') 07 >>> title('F(x)=x**2') 08 >>>a=axes([0.35,0.5,0.3,0.27] ,axisbg='y') 09 >>> plot(x,z,'r--',lin width=2) 10 >>> title('exponencial') 11 >>> set(a,xticks=[]) 12 >>> show()

Figura 6: Expresin de Latex en la figura.

ca, el tipo y el color de la lnea, etc. Tambin se pueden fijar las propiedades del texto, como por ejemplo,
>>> xlabel('coord. x',U color='r', size=12) >>> l=ylabel('cuadr do') >>> l.set_weight('bold')

y as sucesivamente Podemos cargar el fichero en un array Z mediante el comando load('path_fichero'). La forma de Z es el nmero de filas por 2 columnas, donde la primera columna almacena los tiempos y la segunda las velocidades. El modo de extraer las columnas en arrays 1d es,
>>> Z=load('datos.dat') >>> t=Z[:,0] >>> v=Z[:,1] >>> plot(t,v,'ro',U markeredgecolor='b',U markersize=10) >>> show()

En la pgina web de matplotlib podis encontrar todas las propiedades de una figura, grfica, texto, etc.

Cargar y guardar ficheros ASCII


Suponed que tenemos un fichero datos.dat con una estructura en columnas, donde la primera columna almacena el tiempo t y la segunda los valores

Os tiene que aparecer una grfica pequea con fondo amarillo, sobre la grfica principal; tal como se muestra en la Figura 4. No confundis el comando axes con axis. El primero se utiliza para organizar grficas; mientras que axis([xmin,xmax,ymin,ymax]) determina los lmites de los ejes asociados a una grfica. En los diferentes ejemplos, os habris dado cuenta de que se puede modificar el color de fondo de la grfi-

En el rea de descarga tenis un fichero de pruebas, cuya grfica se corresponde con la Figura 5. Tambin podis guardar un array de datos en un fichero de tipo ASCII mediante el comando save('path_fichero'). El siguiente cdigo muestra como crear dicho fichero,
x=arange(-2,2,0.5) y=x**3 Z=zeros((len(x),2),Float) Z[:,0]=x Z[:,1]=y save('../cubo.dat',Z)

Listado 2: Importacin de paquetes mnimos para GUI Tkinter


01 import matplotlib 02 matplotlib.use('TkAgg') 03 04 from matplotlib.numerix import arange,sqrt 05 from matplotlib.axes import Subplot 06 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 07 from matplotlib.figure import Figure 08 09 import Tkinter as Tk

Aadiendo LATEX
Matplotlib soporta expresiones matemticas escritas en LATEX (Figura 6). Se aade como una cadena de texto delimitada por $ a ambos lados, es decir, r'$\ \sum_{k=0}^{10} \pi k/10 \ $'; sin embargo, lo que no est permitido es embeber Latex en una cadena de texto: r' Numero $\pi$'. En el rea de descarga tenis el fichero ej_latex.py que contiene el cdigo correspondiente a la Figura 6.

Capturar imgenes
La ventana de la figura, por defecto, contiene un botn para capturar la imagen y

Figura 7: Embeber Matplotlib en Tkinter.

WWW.LINUX- MAGAZINE.ES

Nmero 11

55

053-056_Mathlab_linux11

11.10.2005

10:32

Uhr

Pgina

56

DESARROLLO Matplotlib

tro de la que situamos una subgrfica mediante el comando a=f.add_subplot(111). La figura f se asocia al rea de dibujo de Tk, Figura 9: Diferentes ejemplos donde se canvas=Figure embebe Matplotlib en WX. CanvasTkAgg, que se muestra cdigo, sin que mediante el comando canvas.show(). sea necesario Este canvas se sita en la GUI mediante abrir la ventana canvas.get_tk_widget().pack o Figura 8: Diferentes ejemplos donde se embebe Matplotlib en WX. de GTK. Probad canvas._tkcanvas.pack(). el cdigo del La clase NavigationToolbar2TkAgg guardarla en formato .png, .eps, .bmp Listado 1, donde se guardan varias imconstruye una barra de herramientas de (basta indicar la extensin); sin embargenes empleando un bucle for. navegacin, que permite interactuar con go, esto tambin podemos hacerlo en Mediante savefig('path_file') se captuel rea de dibujo. Para mostrar dicha ra la figura y se guarda en el formato que barra basta emplear el comando updaListado 3: Embeber matplo- le indiquis; en caso de no especificar te(). Con estos sencillos comandos ya extensin se usa .png (establecida por tlib en GUI Tkinter sabis lo necesario para desarrollar grdefecto). Los formatos .jpeg y .tiff no ficas en Matplotlib y crear vuestras proestn soportados. Probad a comentar la 01 root = Tk.Tk() pias interfaces que contengan un rea lnea hold(False), como veris las gr02 root.wm_title("Embeber Tk") de dibujo. Si estis ms familiarizados ficas se van superponiendo. 03 con Wx, GTK, la idea a seguir es la 04 f = Figure(figsize=(5,4), Embeber matplotlib en una misma, siempre se crea un rea de dpi=100) aplicacin dibujo en la que se situan las Figuras 05 a = f.add_subplot(111) Matplotlib puede embeberse dentro de que contengan las grficas. En la Figura 06 t=arange(0.,15.,0.1) una aplicacin desarrollada en los 8 se muestra una captura de una inter07 s= sqrt(t) siguientes toolkits: WX, Tkinter, GTK, face en Wx con un rea de dibujo de 08 a.plot(t,s) I FLTK. Nosotros vamos a ver un ejemplos matplotlib. 09 sencillo empleanto Tkinter. 10 canvas = FigureCanvasTkAgg(f, Lo primero es indicar el tipo de toolkit master=root) RECURSOS que vamos a utilizar mediante matplo11 canvas.show() tlib.use(backend), donde: 12 [1] Pasos para la instalacin de backend='WXAgg' si empleamos WX, Matplotlib: http://matplotlib. canvas.get_tk_widget().pack(si backend='TkAgg' si optamos por sourceforge.net/installing.html de=Tk.TOP, fill=Tk.BOTH, Tkinter y backend='GTK' para GTK. expand=1) [2] Matplotlib: http://matplotlib. Cread un fichero que llamaris matsourceforge.net/ 13 plot_tkinter.py (en el rea de descargas 14 toolbar = [3] Python: http://www.python.org tenis desarrollado el cdigo completo). NavigationToolbar2TkAgg( canEn el Listado 2 estn escritos todos los vas, root ) paquetes que vamos a necesitar. 15 toolbar.update() Ana M. Ferreirro Ferreiro es mateCreamos una ventana de Tkinter 16 mtica, pero su verdadera pasin donde colocaremos: a) #canvas._tkcanvas.pack(side=Tk es la informtica. As que parte de FigureCanvasTkAgg: rea de dibujo; b) .TOP, fill=Tk.BOTH, expand=1) su tiempo lo dedica al desarrollo NavigationToolbar2TkAgg: barra de en Python de interfaces grficas 17 herramientas con los controles (zoom, multiplataforma, y al desarrollo de 18 button = software de visualizacin cientfitraslacin, etc.) y c) botn salir. En el Tk.Button(master=root, ca 3D. Listado 3 se recoge el cdigo para destext='Salir', arrollar la GUI con esta estructura Jos A. Garca Rodrguez tambin command=sys.exit) es matemtico y desde hace unos (Figura 7). 19 button.pack(side=Tk.BOTTOM) aos se dedica al desarrollo de Mediante f=Figure(figsize(5,4), 20 cdigo paralelo y optimizacin de dpi=100) creamos una figura, indicando 21 Tk.mainloop() cdigos en C++. el tamao y la relacin ancho/alto, den-

56

Nmero 11

WWW.LINUX- MAGAZINE.ES

LOS AUTORES

También podría gustarte