Post on 03-Mar-2016
description
Introduccion a la Computacion
Matplotlib y otros graficadores
Maximiliano Geier
Facultad de Ciencias Exactas y Naturales, UBA
5/06/2014
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 1 / 19
Matplotlib
Matplotlib
Paquete de software libre desarrolladooriginalmente por John D. Hunter(19682012) y cientos de colaboradoresvoluntarios alrededor del mundo.
Pensado como un reemplazo libre delMATLAB hecho en Python.
Ademas, Hunter era un obsesivo y no legustaban los graficos de MATLAB, as quelos de Matplotlib son (en general)visualmente mas atractivos.
Como esta hecho en Python, se integrafacilmente con otras herramientas devisualizacion de datos que tambien estanen Python (como el IPython Notebook1oMayavi2).
1.00.50.00.51.0 1.0
0.50.00.51.00.6
0.4
0.2
0.0
0.2
0.4
0.6
1http://ipython.org/notebook.html2http://code.enthought.com/projects/mayavi/
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 3 / 19
Matplotlib
Matplotlib
En lugar de usar su propio lenguaje como MATLAB, los scripts para graficar se escriben enteramente enPython. Tiene un modulo para graficacion llamado pylab, que se programa de una manera similar aMATLAB (es una maquina de estados).
Para manejar datos hace uso extensivo de la biblioteca de algebra lineal numpy.
Un ejemplo3:
import matplotlib.pyplot as plt
import numpy as np
with plt.xkcd():
# Based on "Stove Ownership" from XKCD by Randall Monroe
# http://xkcd.com/418/
fig = plt.figure()
ax = fig.add_axes((0.1, 0.2, 0.8, 0.7))
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)
plt.xticks([])
plt.yticks([])
ax.set_ylim([-30, 10])
data = np.ones(100)
data[70:] -= np.arange(30)
plt.annotate(THE DAY I REALIZED
I COULD COOK BACON\nWHENEVER I WANTED,
xy=(70, 1), arrowprops={arrowstyle:->},
xytext=(15, -10))
plt.plot(data)
plt.xlabel(TIME)
plt.ylabel(MY OVERALL HEALTH)
fig.text(0.5, 0.05,
"STOVE OWNERSHIP" FROM XKCD BY RANDALL MONROE, ha=center)
3http://matplotlib.org/mpl_examples/showcase/xkcd.py
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 4 / 19
Matplotlib
Hello, world!
Vamos a escribir un plot muy sencillo de una funcion en dos dimensiones.
1 Importamos el modulo de graficacion de matplotlib ynumpy:
import matplotlib.pyplot as pltimport numpy as np
2 Construimos vectores para las coordenadas x e y:
# como rangex = np.arange(0, 2, 0.01)# aplico sin(2pi t) a cada elemento# t del vector xy = np.sin(2*np.pi*x)
3 Ttulo y etiquetas para los ejes:
plt.title(Hello, world!)plt.xlabel(tiempo (s))plt.ylabel(voltaje (mV))
4 Graficamos y en funcion de x:
plt.plot(x, y)
5 Podemos mostrar la figura en pantalla:
plt.show()
6 Tambien guardarla en un archivo:
plt.savefig(hello.pdf)
0.0 0.5 1.0 1.5 2.0tiempo (s)
1.0
0.5
0.0
0.5
1.0
voltaje (mV)
Hello, world!
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 5 / 19
Matplotlib
Cargando datos
En general lo que vamos a querer graficar no es una funcion conocida, sino unconjunto de datos que tenemos guardados en algun lado.
Matplotlib nos ofrece (a traves de numpy) ciertas comodidades para cargar datos dearchivos.
1 Archivos de texto con tuplas de numeros, una tupla por lnea:
datos = np.loadtxt(archivo.txt) # separados por espaciosdatoscsv = np.loadtxt(archivo.csv, delimiter=,) # CSV
2 Formato numpy (generado con np.save):
datos = np.load(archivo.npy)
3 Imagenes:
img = plt.imread(archivo.png)
4 Excel: lo mas sencillo es exportar los datos de Excel a CSV (desde el mismo Excel).Tambien se puede usar el paquete pandas4 para cargar planillas de Excel directamente.
4http://stackoverflow.com/a/17053360
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 6 / 19
Matplotlib
Graficando varios sets de datos
Supongamos que tenemos un archivo con datos donde cada fila tiene 3 columnas yqueremos graficar la segunda en funcion de la primera y la tercera en funcion de laprimera en un mismo grafico.
1 En varios plots:
datos = np.loadtxt(datos.txt)
plt.plot(datos[:,0], datos[:,1])
plt.plot(datos[:,0], datos[:,2])
2 Un solo plot:
plt.plot(datos[:,0], datos[:,1:])
3 Si queremos agregar una leyenda describiendo cada curva, tenemos que ponerle unlabel a cada plot y luego generamos la leyenda:
plt.plot(datos[:,0], datos[:,1], label=D&C)
plt.plot(datos[:,0], datos[:,2], label=Fuerza bruta)
plt.legend()
Nota de implementacion: elegir filas o columnas de un conjunto de datos de numpy sehace por referencia. Esto quiere decir que si modificamos datos[:,0] el cambio tambiense ve en datos. Si queremos una copia, hay que usar datos[:,0].copy().
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 7 / 19
Matplotlib
Cambiando el formato
Si no le decimos nada, Matplotlib dibuja con lneas llenas y colores asignados deforma automatica, de forma que no se pisen las lneas entre s.
La funcion plt.plot tiene opciones que permiten configurar como se ven las curvas.
Algunos ejemplos:
# lneas mas gruesas de color rojo
plt.plot(x, y, color=red, linewidth=2.5)
# lnea punteada
plt.plot(x, y, linestyle=--)
# color azul y redondeles en cada punto del set de datos
plt.plot(x, y, bo)
Tiene muchas opciones. Pueden ver help(plt.plot)
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 8 / 19
Matplotlib
Cambiando propiedades de los ejes
Cuando hacemos un plot nuevo Matplotlib nos setea valores default para los lmites delos ejes y los ticks (los valores que muestra sobre cada eje). Estos lmites dependen de losvalores extremos de los vectores.Si los defaults no se ven bien, los podemos modificar:
# ploteamos
plt.plot(x, y)
# para que se vea un 10% mas de valores a cada lado en ambos ejes
# (asumiendo que los mnimos son negativos y los maximos positivos)
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(y.min()*1.1, y.max()*1.1)
# mostramos los valores desde pi hasta pi en el eje xplt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
# valores -1, 0 y 1 en el eje y
plt.yticks([-1, 0, 1])
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 9 / 19
Matplotlib
Usando Matplotlib
Matplotlib se puede usar interactivamente desde la consola de Python o desde unprograma.
Desde la consola normal de Python:
mgeier@xpsmax:~$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
>>> import numpy as np
Desde la consola de IPython:
mgeier@xpsmax:~$ ipython3 --pylab
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
Type "copyright", "credits" or "license" for more information.
Using matplotlib backend: TkAgg
In [1]:
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 10 / 19
Matplotlib
Otros tipos de plots
Histogramas: plt.hist
Graficos de barra: plt.bar
Graficos de torta: plt.pie
Scatter plot (puntos sobre un plano):plt.scatter
Superficie 3D: plt.plot_surface
40 60 80 100 120 140 160Smarts
0.000
0.005
0.010
0.015
0.020
0.025
0.030
Probability
Histogram of IQ: =100, =15
A B C D EGroup
0
5
10
15
20
25
30
35
40
Scores
Scores by group and gender
MenWomen
Frogs
15.0%
Hogs
30.0%
Dogs
45.0%
Logs
10.0%
0.15 0.10 0.05 0.00 0.05 0.10 0.15 0.20 0.25
i
0.15
0.10
0.05
0.00
0.05
0.10
0.15
0.20
0.25
i+1
Volume and percent change
6 4 2 0 2 4 6 6420246-1.01-0.79-0.56-0.34-0.110.110.340.560.791.01
0.80.60.40.20.00.20.40.60.8
6 4 2 0 2 4 6 64202461.0
0.6
0.2
0.2
0.6
1.0
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 11 / 19
Gnuplot
Gnuplot
Uno de los primeros sistemas degraficacion scripteables.
Desarrollado originalmente por ColinKelly y Thomas Williams en 1986.
Actualmente es el mas usado de losgraficadores de este tipo, funciona en lamayora de los sistemas operativos.
Varios programas lo utilizan comomotor de graficacion (por ejemploQtiPlot).
A diferencia de Matplotlib, usa supropio lenguaje especializado engraficar figuras.
Soporta salidas en distintos formatospor medio de sus muchos terminaldrivers: qt, canvas, svg, pdf, png,tikz, latex, windows, etc.
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 13 / 19
Gnuplot
Hello, world!
Vamos a ver como se escribe el mismo plot de antes en gnuplot:
1 Ttulo y textos de los ejes:
set title "Hello, world!"set xlabel "tiempo (s)"set ylabel "voltaje (mV)"
2 Rango del eje X:
set xrange [0:2]
3 Graficamos:
plot sin(2*pi*x)
4 (Opcional) Si queremos guardar la figuraen un PDF:
set term pdfset output "figura.pdf"replot
-1
-0.8-0.6
-0.4-0.2
0
0.2 0.4
0.6 0.8
1
0 0.5 1 1.5 2
volta
je (m
V)tiempo (s)
Hello, world!
sin(2*pi*x)
Nota de implementacion: la salida a PDF no guarda el archivo hasta que no escerrado. Se puede forzar su cierre con set output sin ningun nombre.
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 14 / 19
Gnuplot
Graficando datos de un archivo
Volvamos al ejemplo del archivo de datos con 3 columnas. Si queremos repetir el mismoplot en gnuplot, podemos cargar los datos directamente desde el comando plot:
plot datos.txt using 1:2 with lines title D&C, \
datos.txt using 1:3 with lines title Fuerza bruta
plot: soporta varios argumentos separados por comas, cada uno es una funcion oconjunto de puntos a graficar.
using N:M: usa las columnas especificadas del dataset.
with lines: plotear un conjunto de puntos predeterminadamente nos marca sololos puntos.
title : pone como label de ese conjunto de datos o funcion.
Al igual que en Matplotlib, la funcion plot tiene muchos modificadores para cambiar laapariencia de los graficos.
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 15 / 19
Gnuplot
Usando gnuplot
Gnuplot se puede usar interactivamente o en modo batch.
En el modo interactivo escribimos los comandos en la consola.
mgeier@xpsmax:~$ gnuplot
G N U P L O T
Version 4.6 patchlevel 4 last modified 2013-10-02
Build System: Linux x86_64
Terminal type set to wxt
gnuplot>
En el modo batch escribimos un script con todos los comandos y luego gnuplot loslee lnea por lnea.
mgeier@xpsmax:~$ gnuplot hello.gpi
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 16 / 19
Otros graficadores
Otros graficadores scripteables
Software libre:
GNU Octave: alternativa libre al MATLAB, usa un formato de scripting bastantecompatible.
R: paquete estadstico, lenguaje propio orientado a objetos.
ROOT: paquete de analisis de datos desarrollado en CERN, se programa en C++(tambien orientado a objetos).
Software propietario:
MATLAB: lenguaje propio (imperativo).
Origin: lenguaje propio (imperativo).
SAS: lenguaje propio.
SPSS: lenguaje propio, tambien se puede usar desde Python y VB.NET.
Maple: lenguaje propio (imperativo).
Lista completa: http://en.wikipedia.org/wiki/List_of_graphing_software
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 18 / 19
Otros graficadores
Referencia adicional
Tutorial de Matplotlib: http://www.loria.fr/~rougier/teaching/matplotlib/
Ejemplos 2D: http://matplotlib.org/users/screenshots.html
Ejemplos 3D:http://matplotlib.org/examples/mplot3d/index.html#mplot3d-examples-index
Gua de usuario (Matplotlib): http://matplotlib.org/Matplotlib.pdf
Gua de usuario (NumPy): http://docs.scipy.org/doc/numpy/numpy-ref-1.8.1.pdf
Stackoverflow: http://stackoverflow.com/questions/tagged/matplotlib
NumPy for Matlab Users: http://wiki.scipy.org/NumPy_for_Matlab_Users
Ejemplos de gnuplot: http://gnuplot.sourceforge.net/demo/
Gua de usuario (gnuplot): http://gnuplot.sourceforge.net/docs_cvs/gnuplot.pdf
gnuplot Quick Reference: http://www.gnuplot.info/docs_4.0/gpcard.pdf
Maximiliano Geier (UBA) Clase 20: Matplotlib y otros graficadores 5/06/2014 19 / 19
MatplotlibGnuplotOtros graficadores