You are on page 1of 16

Introducci

on a la Computaci
on

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 desarrollado


originalmente por John D. Hunter
(19682012) y cientos de colaboradores
voluntarios alrededor del mundo.
Pensado como un reemplazo libre del
MATLAB hecho en Python.
Adem
as, Hunter era un obsesivo y no le
gustaban los gr
aficos de MATLAB, as que
los de Matplotlib son (en general)
visualmente m
as atractivos.
Como est
a hecho en Python, se integra
f
acilmente con otras herramientas de
visualizaci
on de datos que tambi
en est
an
en Python (como el IPython Notebook1 o
Mayavi2 ).

1
2

1.0 0.5

0.0

0.5

1.0 1.0

0.6
0.4
0.2
0.0
0.2
0.4
0.6
1.0
0.5
0.0
0.5

http://ipython.org/notebook.html
http://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 en
Python. Tiene un m
odulo para graficaci
on llamado pylab, que se programa de una manera similar a
MATLAB (es una m
aquina 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)
3

http://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 funci
on en dos dimensiones.
1

Importamos el m
odulo de graficaci
on de matplotlib y
numpy:
import matplotlib.pyplot as plt
import numpy as np

#
x
#
#
y
3

como range
= np.arange(0, 2, 0.01)
aplico sin(2 t) a cada elemento
t del vector x
= np.sin(2*np.pi*x)

Ttulo y etiquetas para los ejes:


plt.title(Hello, world!)
plt.xlabel(tiempo (s))
plt.ylabel(voltaje (mV))

0.5

0.0

0.5

Graficamos y en funci
on de x:
1.0
0.0

plt.plot(x, y)
5

Hello, world!

1.0

Construimos vectores para las coordenadas x e y:

voltaje (mV)

0.5

1.0
tiempo (s)

1.5

2.0

Podemos mostrar la figura en pantalla:


plt.show()

Tambi
en guardarla en un archivo:
plt.savefig(hello.pdf)
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 funci


on conocida, sino un
conjunto de datos que tenemos guardados en alg
un lado.
Matplotlib nos ofrece (a traves de numpy) ciertas comodidades para cargar datos de
archivos.
1

Archivos de texto con tuplas de n


umeros, una tupla por lnea:
datos = np.loadtxt(archivo.txt) # separados por espacios
datoscsv = np.loadtxt(archivo.csv, delimiter=,) # CSV

Formato numpy (generado con np.save):


datos = np.load(archivo.npy)

Im
agenes:
img = plt.imread(archivo.png)

Excel: lo m
as sencillo es exportar los datos de Excel a CSV (desde el mismo Excel).
Tambi
en se puede usar el paquete pandas4 para cargar planillas de Excel directamente.

http://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 y
queremos graficar la segunda en funci
on de la primera y la tercera en funci
on de la
primera en un mismo gr
afico.
1

En varios plots:
datos = np.loadtxt(datos.txt)
plt.plot(datos[:,0], datos[:,1])
plt.plot(datos[:,0], datos[:,2])

Un solo plot:
plt.plot(datos[:,0], datos[:,1:])

Si queremos agregar una


label a cada plot y luego
plt.plot(datos[:,0],
plt.plot(datos[:,0],
plt.legend()

leyenda describiendo cada curva, tenemos que ponerle un


generamos la leyenda:
datos[:,1], label=D&C)
datos[:,2], label=Fuerza bruta)

Nota de implementaci
on: elegir filas o columnas de un conjunto de datos de numpy se
hace por referencia. Esto quiere decir que si modificamos datos[:,0] el cambio tambien
se 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 de


forma autom
atica, de forma que no se pisen las lneas entre s.
La funci
on plt.plot tiene opciones que permiten configurar c
omo se ven las curvas.
Algunos ejemplos:
# l
neas m
as gruesas de color rojo
plt.plot(x, y, color=red, linewidth=2.5)
# l
nea 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 de
los ejes y los ticks (los valores que muestra sobre cada eje). Estos lmites dependen de los
valores 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% m
as de valores a cada lado en ambos ejes
# (asumiendo que los m
nimos son negativos y los m
aximos 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 hasta en el eje x
plt.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 un
programa.
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


0.030

Histogram of IQ: =100, =15

35
30
25
Scores

Probability

0.020

Histogramas: plt.hist

0.015
0.010

20
15
10
5

0.005
0.000
40

Gr
aficos de barra: plt.bar

Scores by group and gender


Men
Women

40

0.025

0
60

80

100 120
Smarts

140

160

Logs

Frogs

A
0.25

C
Group

Volume and percent change

0.20
15.0%

10.0%

0.15

i +1

0.10

Gr
aficos de torta: plt.pie
Hogs

30.0%

45.0%
Dogs

0.05
0.10
0.15
0.15 0.10 0.05 0.00 0.05 0.10 0.15 0.20 0.25

Scatter plot (puntos sobre un plano):


plt.scatter

Superficie 3D: plt.plot_surface


2
6 4
0
20
2
4
2 4
6 6

Maximiliano Geier (UBA)

0.05
0.00

Clase 20: Matplotlib y otros graficadores

1.01
0.79
0.56
0.34
0.11
-0.11
-0.34
-0.56
-0.79
-1.01
6
4

0.8
0.6
0.4
0.2
0.0
0.2
0.4
0.6
0.8
2
6 4
0
2 0
2
4
2 4
6 6

5/06/2014

1.0
0.6
0.2
0.2
0.6
1.0
6

11 / 19

Gnuplot

Gnuplot
Uno de los primeros sistemas de
graficaci
on scripteables.
Desarrollado originalmente por Colin
Kelly y Thomas Williams en 1986.
Actualmente es el m
as usado de los
graficadores de este tipo, funciona en la
mayora de los sistemas operativos.
Varios programas lo utilizan como
motor de graficaci
on (por ejemplo
QtiPlot).
A diferencia de Matplotlib, usa su
propio lenguaje especializado en
graficar figuras.
Soporta salidas en distintos formatos
por medio de sus muchos terminal
drivers: 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 c
omo 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)"

Hello, world!
1

sin(2*pi*x)

0.8
0.6

Rango del eje X:


voltaje (mV)

0.4

set xrange [0:2]


3

Graficamos:

0
-0.2
-0.4

plot sin(2*pi*x)
4

0.2

-0.6

(Opcional) Si queremos guardar la figura


en un PDF:

-0.8
-1

0.5

1.5

tiempo (s)

set term pdf


set output "figura.pdf"
replot

Nota de implementaci
on: la salida a PDF no guarda el archivo hasta que no es
cerrado. Se puede forzar su cierre con set output sin ning
un 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 mismo
plot 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 funci
on o
conjunto de puntos a graficar.
using N:M: usa las columnas especificadas del dataset.
with lines: plotear un conjunto de puntos predeterminadamente nos marca solo
los puntos.
title <texto>: pone <texto> como label de ese conjunto de datos o funci
on.
Al igual que en Matplotlib, la funci
on plot tiene muchos modificadores para cambiar la
apariencia de los gr
aficos.

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 los
lee 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 bastante
compatible.
R: paquete estadstico, lenguaje propio orientado a objetos.
ROOT: paquete de an
alisis 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

You might also like