introduccion a la computacion, matplotlib y otros graficadores

Upload: david-carranza

Post on 03-Mar-2016

35 views

Category:

Documents


0 download

DESCRIPTION

Manual de graficas en python utilizando matplotlib

TRANSCRIPT

  • 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