4
Representación gráfica 2D MATPLOTLIB Actualmente existen numerosas herramientas para analizar datos y representarlos en gráficas 2D, quizás una de las más 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 GARCÍA Y ANA FERREIRO M atplotlib es una biblioteca escri- ta en puro python, que hace un uso intensivo de Numeric/ numarray y otras extensiones para pro- porcionar un buen manejo de grandes arrays, permitiendo: crear gráficas de calidad (suavizado de fuentes), interac- cionar con el área gráfica (zoom, trasla- ción, etc), guardar figuras en diferentes formatos (.png, postcript), “embeber” el área gráfica 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 características de Matplotlib. Instalación Para poder realizar todas las pruebas que se van proponiendo y las que a vosotros se os ocurran, es necesario tener instala- do Python y Matplotlib. En la pagina web [1] se detallan los pasos a seguir en la instalación, así como las diferentes opciones para configurar matplotlib. Primeras gráficas Aunque matplotlib dispone de una API de orientación de objetos, el principal modo para crear gráficas es a través de la inter- faz de pylab, que se importa mediante, Matplotlib • DESARROLLO 53 Número 11 WWW.LINUX - MAGAZINE.ES 53 s 01 x=arange(0,2,0.1) 02 ext=['.png','.eps','.ps','.svg '] 03 s='fig' 04 for k in range(0,3): 05 y=sin((k+1)*pi*x) 06 plot(x,y) 07 name_fich=s+str(k)+ext[1] 08 savefig(name_fich) 09 hold(False) Listado 1: Capturas en dife- rentes formatos 053-056_Mathlab_linux11 11.10.2005 10:31 Uhr Página 53

Mat Plot Lib

Embed Size (px)

Citation preview

Page 1: Mat Plot Lib

Representación gráfica 2D

MATPLOTLIB

Actualmente existen numerosas herramientas para analizar datos y representarlos en gráficas 2D, quizás una

de las más 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 GARCÍA Y ANA FERREIRO

Matplotlib es una biblioteca escri-ta en puro python, que hace unuso intensivo de Numeric/

numarray y otras extensiones para pro-porcionar un buen manejo de grandesarrays, permitiendo: crear gráficas decalidad (suavizado de fuentes), interac-cionar con el área gráfica (zoom, trasla-ción, etc), guardar figuras en diferentesformatos (.png, postcript), “embeber” elárea gráfica en diferentes toolkits para eldesarrollo de GUIs (GTK, WxPython yTkinter), etc.

En lo que sigue, veremos una serie deejemplos, abordando las principalescaracterísticas de Matplotlib.

InstalaciónPara poder realizar todas las pruebas quese van proponiendo y las que a vosotrosse os ocurran, es necesario tener instala-do Python y Matplotlib.

En la pagina web [1] se detallan lospasos a seguir en la instalación, así comolas diferentes opciones para configurarmatplotlib.

Primeras gráficasAunque matplotlib dispone de una API deorientación de objetos, el principal modopara crear gráficas es a través de la inter-faz de pylab, que se importa mediante,

Matplotlib • DESARROLLO

53Número 11W W W . L I N U X - M A G A Z I N E . E S 53

s01 x=arange(0,2,0.1)

02ext=['.png','.eps','.ps','.svg']

03 s='fig'04 for k in range(0,3):05 y=sin((k+1)*pi*x)06 plot(x,y)07 name_fich=s+str(k)+ext[1]08 savefig(name_fich)09 hold(False)

Listado 1: Capturas en dife-rentes formatos

053-056_Mathlab_linux11 11.10.2005 10:31 Uhr Página 53

Page 2: Mat Plot Lib

En una misma figurapodemos dibujar variasgráficas simultáneamen-te, esto se controla men-diante el comando hold.Por defecto, sobre unafigura se pueden super-poner gráficas(hold(True)); si queremosque la gráfica se borreante un nuevo comandode plot, basta indicarlomediante hold(False).Probad las siguienteslíneas de código,

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

Ahora tenemos tres gráficas en la mismafigura (Figura 2). Escribid hold(False)después de la primera gráfica p1. ¿Quéocurre? Sólo se dibuja la última gráficap3. Si queremos que se representen en lamisma figura las gráficas p2 y p3, esnecesario indicarlo mediante hold(True)después de p2.

En el código previo, con los diferen-tes comandos plot, se representan lasgráficas en diferentes tipos. La gráficap1 se dibuja en color verde en líneacontinua y marcas de puntos (‘g-o’); p2es la línea roja discontinua (‘r--‘) y p3se muestra en color azul en línea dis-continua con marcas dediamantes (‘b--d’).Mediante linewidth con-trolamos el ancho de lalínea. En la página de mat-plotlib se detallan todaslas propiedades de unalínea.

SubgráficasEn una figura es posiblerepresentar diferentes grá-ficas en una estructura demalla regular numFilaspor numColumnas. Porejemplo, para crear tres

filas y una columna, tenéis que escribirsubplot(311) para crear la parte supe-rior, subplot(312) para crear la gráficacentral, y subplot(313) para crear la grá-fica inferior. Veámoslo mejor con elsiguiente ejemplo (Figura 3),

01 >>> subplot(311)02 >>> plot(t,y,'b-d')03 >>> ylabel('sin')04 >>> subplot(312)05 >>> plot(t,x,'r--',linwidth=3)06 >>> ylabel('sqrt')07 >>> subplot(313)08 >>> plot(t,s,'g-o',linwidth=2)09 >>> ylabel('cos')10 >>> show()

Puede suceder que el tipo de estructu-ra proporcionada por subplot no sea loque queremos, en este caso hay queemplear el comando axes para situarlas diferentes gráficas dentro de lafigura en las posiciones que le indi-quéis. El comando axes se inicializa

from pylab import *

Hay dos modos de trabajar en la interfazde pylab: interactivamente o mediantescripts. Veremos ambos.

Pongámonos manos a la obra… Paradibujar la función coseno basta escribiren el interprete de Python las siguienteslíneas:

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

Con el comando plot(t,x) se crea la gráficade “t” frente a “s”; mientras que medianteshow() se abre una GUI interactiva (Figura1) que contiene a la gráfica. Tened encuenta que el tipo de ventana va a depen-der el toolkit de GUI que tengáis por defec-to en el fichero de configuración de mat-plotlib, en nuestro caso la ventana es deGTK. Con los comandos xlabel, ylabel ytitle etiquetamos los ejes ‘x’ e ‘y’ de la grá-fica y escribimos el título de la misma, res-pectivamente. Por defecto la gráfica serepresenta en línea continua, a no ser quemodifiquemos sus propiedades…

DESARROLLO • Matplotlib

54 Número 11 W W W . L I N U X - M A G A Z I N E . E S

Figura 2: Varias gráficas en la misma figura.

Figura 4: Uso del comando axes para colocar una gráfica

sobre otra.

Figura 3: Subgráficas estructuradas en una

“malla” 3 x 1.

Figura 1: Gráfica dentro de una interface de

usuario GTKAgg interactiva.

053-056_Mathlab_linux11 11.10.2005 10:32 Uhr Página 54

Page 3: Mat Plot Lib

Matplotlib • DESARROLLO

55Número 11W W W . L I N U X - M A G A Z I N E . E S

ca, el tipo y el color de la línea, etc.También se pueden fijar las propieda-des del texto, como por ejemplo,

>>> xlabel('coord.x',Ucolor='r', size=12)>>> l=ylabel('cuadrdo')>>>l.set_weight('bold')

En la página web de matplotlib podéisencontrar todas las propiedades de unafigura, gráfica, texto, etc.

Cargar y guardar ficherosASCIISuponed que tenemos un fichero‘datos.dat’ con una estructura en colum-nas, donde la primera columna almace-na el tiempo ‘t’ y la segunda los valores

de velocidades ‘v’, porejemplo; es decir,

1. 0.352. 0.650.4 0.34

… y así sucesivamentePodemos cargar el fiche-

ro en un array Z medianteel comandoload('path_fichero'). Laforma de Z es el número defilas por 2 columnas,donde la primera columna

almacena los tiempos y la segunda lasvelocidades. El modo de extraer lascolumnas en arrays 1d es,

>>> Z=load('datos.dat')>>> t=Z[:,0]>>> v=Z[:,1]>>> plot(t,v,'ro',Umarkeredgecolor='b',Umarkersize=10)>>> show()

En el área de descarga tenéis un ficherode pruebas, cuya gráfica se correspondecon la Figura 5.

También podéis guardar un array dedatos en un fichero de tipo ASCIImediante el comando save('path_fiche-ro'). El siguiente código muestra comocrear dicho fichero,

x=arange(-2,2,0.5)y=x**3Z=zeros((len(x),2),Float)Z[:,0]=xZ[:,1]=ysave('../cubo.dat',Z)

Añadiendo LATEXMatplotlib soporta expresiones mate-máticas escritas en LATEX (Figura 6).Se añade como una cadena de textodelimitada por “$” a ambos lados, esdecir, r'$\ \sum_{k=0}^{10} \pi k/10 \$'; sin embargo, lo que no está permiti-do es ‘embeber’ Latex en una cadenade texto: r' Numero $\pi$'. En el áreade descarga tenéis el fichero ej_latex.pyque contiene el código correspondientea la Figura 6.

Capturar imágenesLa ventana de la figura, por defecto, con-tiene un botón para capturar la imagen y

con un rectángulo[izq,fondo,ancho,alto] en coordenadasrelativas normalizadas (0,1). izq,fondo = (0,0) es el punto inferior a laizquierda del canvas de la figura.Escribid las siguientes líneas,

01 >>> x=arange(-2.,2.1,0.1)02 >>> y=x**203 >>> 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--',linwidth=2)10 >>> title('exponencial')11 >>> set(a,xticks=[])12 >>> show()

Os tiene que aparecer una gráfica peque-ña con fondo amarillo, sobre la gráficaprincipal; tal como se muestra en laFigura 4.

No confundáis el comando axes conaxis. El primero se utiliza para organi-zar gráficas; mientras queaxis([xmin,xmax,ymin,ymax]) determi-na los límites de los ejes asociados auna gráfica.

En los diferentes ejemplos, oshabréis dado cuenta de que se puedemodificar el color de fondo de la gráfi-

01 import matplotlib02 matplotlib.use('TkAgg')0304 from matplotlib.numerix import

arange,sqrt05 from matplotlib.axes import

Subplot06 from matplotlib.backends.bac-

kend_tkagg importFigureCanvasTkAgg,NavigationToolbar2TkAgg

07 from matplotlib.figure importFigure

0809 import Tkinter as Tk

Listado 2: Importación depaquetes mínimos para GUI

Tkinter

Figura 6: Expresión de Latex en la figura.

Figura 5: Puntos cargados desde un fichero.

Figura 7: Embeber Matplotlib en Tkinter.

053-056_Mathlab_linux11 11.10.2005 10:32 Uhr Página 55

Page 4: Mat Plot Lib

código, sin quesea necesarioabrir la ventanade GTK. Probadel código del

Listado 1, donde se guardan varias imá-genes empleando un bucle for.

Mediante savefig('path_file') se captu-ra la figura y se guarda en el formato quele indiquéis; en caso de no especificarextensión se usa .png (establecida pordefecto). Los formatos .jpeg y .tiff noestán soportados. Probad a comentar lalínea hold(False)…, como veréis las grá-ficas se van superponiendo.

Embeber matplotlib en unaaplicaciónMatplotlib puede embeberse dentro deuna aplicación desarrollada en lossiguientes toolkits: WX, Tkinter, GTK,FLTK. Nosotros vamos a ver un ejemplossencillo empleanto Tkinter.

Lo primero es indicar el tipo de toolkitque vamos a utilizar mediante matplo-tlib.use(backend), donde:backend='WXAgg' si empleamos WX,backend='TkAgg' si optamos porTkinter y backend='GTK' para GTK.

Cread un fichero que llamaréis mat-plot_tkinter.py (en el área de descargastenéis desarrollado el código completo).En el Listado 2 están escritos todos lospaquetes que vamos a necesitar.

Creamos una ventana de Tkinterdonde colocaremos: a)FigureCanvasTkAgg: área de dibujo; b)NavigationToolbar2TkAgg: barra deherramientas con los controles (zoom,traslación, etc.) y c) botón salir. En elListado 3 se recoge el código para des-arrollar la GUI con esta estructura(Figura 7).

Mediante f=Figure(figsize(5,4),dpi=100) creamos una figura, indicandoel tamaño y la relación ancho/alto, den-

tro de la quesituamos unasubgráficamediante elcomandoa=f.add_sub-plot(111). Lafigura f se aso-cia al área dedibujo de Tk,canvas=FigureCanvasTkAgg,que se muestra

mediante el comando canvas.show().Este canvas se sitúa en la GUI mediantecanvas.get_tk_widget().pack ocanvas._tkcanvas.pack().

La clase NavigationToolbar2TkAggconstruye una barra de herramientas denavegación, que permite interactuar conel área de dibujo. Para mostrar dichabarra basta emplear el comando upda-te().

Con estos sencillos comandos yasabéis lo necesario para desarrollar grá-ficas en Matplotlib y crear vuestras pro-pias interfaces que contengan un áreade dibujo. Si estáis más familiarizadoscon Wx, GTK, … la idea a seguir es lamisma, siempre se crea un área dedibujo en la que se situan las Figurasque contengan las gráficas. En la Figura8 se muestra una captura de una inter-face en Wx con un área de dibujo dematplotlib. �

guardarla en formato .png, .eps, .bmp(basta indicar la extensión); sin embar-go, esto también podemos hacerlo en

DESARROLLO • Matplotlib

56 Número 11 W W W . L I N U X - M A G A Z I N E . E S

[1] Pasos para la instalación deMatplotlib: http://matplotlib.sourceforge.net/installing.html

[2] Matplotlib: http://matplotlib.sourceforge.net/

[3] Python: http://www.python.org

RECURSOS

Ana M. Ferreirro Ferreiro es mate-mática, pero su verdadera pasiónes la informática. Así que parte desu tiempo lo dedica al desarrolloen Python de interfaces gráficasmultiplataforma, y al desarrollo desoftware de visualización científi-ca 3D.

José A. García Rodríguez tambiénes matemático y desde hace unosaños se dedica al desarrollo decódigo paralelo y optimización decódigos en C++.

LOS

AU

TO

RE

S01 root = Tk.Tk()02 root.wm_title("Embeber Tk")0304 f = Figure(figsize=(5,4),

dpi=100)05 a = f.add_subplot(111)06 t=arange(0.,15.,0.1)07 s= sqrt(t)08 a.plot(t,s)0910 canvas = FigureCanvasTkAgg(f,

master=root)11 canvas.show()12

canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH,expand=1)

1314 toolbar =

NavigationToolbar2TkAgg( can-vas, root )

15 toolbar.update()16

#canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

1718 button =

Tk.Button(master=root,text='Salir',command=sys.exit)

19 button.pack(side=Tk.BOTTOM)2021 Tk.mainloop()

Listado 3: Embeber matplo-tlib en GUI Tkinter

Figura 9: Diferentes ejemplos donde se

embebe Matplotlib en WX.

Figura 8: Diferentes ejemplos donde se embebe Matplotlib en WX.

053-056_Mathlab_linux11 11.10.2005 10:32 Uhr Página 56