You are on page 1of 25

Una breve introduccin a Matplotlib

Pedro Jorge De Los Santos


2016 Pedro Jorge De Los Santos

Tambin por Pedro Jorge De Los Santos


De MATLAB a Python
Programacin en MATLAB, fundamentos y aplicaciones

A la memoria de John Hunter, al equipo de desarrollo de Matplotlib y toda la comunidad del


Scientific Python.

NDICE GENERAL

ndice general
Aqu comenzamos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Una primera aproximacin: utilizando pylab . . . . . . . . . . . . . . . . . . . . . . . . . .

Lo que hay que saber de NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Creando arrays en Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10
10

Pyplot y lo bsico . . . . . . . . . . . . . .
Coordenadas rectangulares . . . . . . .
Etiquetas bsicas (xlabel, ylabel & title)
Estilos, colores y grosores de lneas . . .
Coordenadas polares . . . . . . . . . . .
Scatter Plots . . . . . . . . . . . . . . .
Grficas de barras . . . . . . . . . . . .
Grficas de pastel . . . . . . . . . . . .

12
13
15
16
19
20
20
20

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

Versin incompleta

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

Aqu comenzamos

Aqu comenzamos
Matplotlib es una librera de Python para el trazo de grficas, desarrollada inicialmente por John
Hunter. Tiene una sintaxis inspirada en MATLAB y comparte mucha similitud en las principales
funciones, aunque Matplotlib permite un desarrollo de grficas utilizando el enfoque orientado a
objetos, lo cual le convierte en una herramienta muy potente.

Versin incompleta

Una primera aproximacin: utilizando pylab

Una primera aproximacin:


utilizando pylab
Este primer captulo tiene como objetivo mostrar algunas de las capacidades de Matplotlib de manera
breve y un tanto superficial, utilizando la interfaz de pylab, esto para familiarizar al lector con la
sintaxis y el uso de algunas funciones elementales.
El mdulo pylab integra las capacidades grficas de Matplotlib con algunas utilidades de NumPy,
proporcionando de esta manera una interfaz muy parecida a MATLAB para el manejo de grficas.
En este captulo vamos a suponer que, antes de todo, se ha importado pylab de la siguiente manera:
1

from pylab import *

Lo anterior nos permitir disponer de todas las funciones de pylab dentro de nuestro script.
Luego, graficar nuestro primer ejemplo ser tan sencillo como escribir.
1
2

plot([1,-2,5,-2,1,0,3])
show()

Versin incompleta

Una primera aproximacin: utilizando pylab

La funcin plot, en el caso anterior, recibe como argumento un arreglo de valores numricos, que
puede ser un lista de Python ordinaria, una tupla, y de manera ms comn un array de NumPy. La
funcin show permite mostrar en pantalla la linea o grfica que se ha creado con plot.
Ahora, como se ha mencionado, pylab tambin permite utilizar funciones de NumPy para la
definicin de arrays. Por ejemplo, con linspace podemos crear un vector de valores numricos:
1

linspace(a,b,n)

Siendo a el extremo inferior, b el extremo superior, y n el nmero de particiones en el intervalo [a, b].
Por ejemplo:
1
2

>>> linspace(1,10,10)
array([ 1.,
2.,
3.,

4.,

5.,

6.,

7.,

8.,

9.,

10.])

Luego, a estos arrays de NumPy podemos aplicarles funciones matemticas predefinidas, por
ejemplo:
Versin incompleta

Una primera aproximacin: utilizando pylab

1
2
3
4
5
6
7
8

>>> x = linspace(0,2*pi,10)
>>> y = cos(x)
>>> x
array([ 0.
, 0.6981317 ,
3.4906585 , 4.1887902 ,
>>> y
array([ 1.
, 0.76604444,
-0.93969262, -0.5
,

1.3962634 ,
4.88692191,

2.0943951 ,
5.58505361,

2.7925268 ,
6.28318531])

0.17364818, -0.5
, -0.93969262,
0.17364818, 0.76604444, 1.
])

Con lo anterior crearemos nuestra primer grfica de una funcin matemtica:


1
2
3
4

x = linspace(0,10)
y = cos(x)
plot(x,y)
show()

Versin incompleta

Una primera aproximacin: utilizando pylab

Note que a linspace no le hemos indicado el nmero de particiones del intervalo, con lo cual se
toma por default un valor de 50.
Podemos cambiar el color y estilo de lnea pasando una cadena de dos caracteres como tercer
argumento, donde el primer caracter indica el color y el segundo el smbolo a utilizar, por ejemplo:
1
2
3
4

x = linspace(0,10)
y = cos(x)
plot(x,y,"ro")
show()

Puede consultar los caracteres vlidos para el color y estilo de lnea en la documentacin de la
funcin plot.
Es posible tambin especificar el color y estilo utilizando keyword arguments dentro de la funcin
plot:
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot
https://docs.python.org/2/tutorial/controlflow.html#keyword-arguments
Versin incompleta

Una primera aproximacin: utilizando pylab

plot(x,y,linestyle="--",color="k")

Adems, el color tambin puede especificarse utilizando la notacin RGBA y la notacin hexadecimal, por ejemplo, las siguientes instrucciones son equivalentes:
1
2
3

plot(x,y,color="r")
plot(x,y,color="#FF0000")
plot(x,y,color=(1,0,0,1))

Podemos incluir etiquetas en los ejes utilizando las funciones xlabel y ylabel. Por ejemplo:
1
2
3
4
5
6
7
8

K = 525
n = 0.2
e = linspace(0,0.5)
s = K*e**n;
plot(e,s,'m')
xlabel(u"Deformacin (mm/mm)")
ylabel(u"Esfuerzo (MPa)")
show()

Versin incompleta

Una primera aproximacin: utilizando pylab

Incluso se puede utilizar cdigo TeX en las etiquetas y ttulo de la grfica:


1
2
3
4
5
6
7
8
9

K = 525
n = 0.2
e = linspace(0,0.5)
s = K*e**n;
plot(e,s,'m')
xlabel(r"$\varepsilon$ (mm/mm)")
ylabel(r"$\sigma$ (MPa)")
title(r"Acero SAE 1008: $\sigma = K \varepsilon^n$")
show()

Versin incompleta

Una primera aproximacin: utilizando pylab

Para poder graficar en dos o ms axes se puede utilizar la funcin subplot que permite crear un
arreglo de axes, vase el ejemplo a continuacin:
1
2
3
4
5
6
7
8
9
10
11
12
13

t = linspace(0,2)
x = 12*t**3 - 18*t**2 + 2*t + 5
v = diff(x)
# Grfica de posicin
subplot(2,1,1)
plot(t,x,"b")
ylabel(u"Posicin (m)")
# Grfica de velocidad
subplot(2,1,2)
plot(t[:-1],v,"g")
xlabel("Tiempo (s)")
ylabel(u"Velocidad (m/s)")
show()

Versin incompleta

Una primera aproximacin: utilizando pylab

Mltiples axes

La funcin subplot recibe tres argumentos, los dos primeros especifican el nmero de filas y
columnas del arreglo de axes, respectivamente, y el tercer argumento indica la posicin del axes
a utilizar. La funcin diff calcula la n-sima derivada numrica de un vector dado.
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.diff.html

Versin incompleta

10

Lo que hay que saber de NumPy

Lo que hay que saber de NumPy


NumPy es una librera de de uso muy extendido en la comunidad tcnico-cientfica de Python, es
imprescindible y un estndar para situaciones en las cuales se manejan datos en forma de vectores
o matrices.
Claro est que para graficar en Matplotlib no es estrictamente necesario utilizar arrays de NumPy,
sino cualquier elemento iterable que pueda contener valores numricos. Pero es evidente que los
arrays de NumPy proporcionan una ventaja enorme cuando se manejan datos que requieren cierto
procesamiento mediante herramientas matemticas.
En este captulo se tratarn funciones bsicas de NumPy que permiten crear y modificar arrays, que
luego se usarn para representarlos en Matplotlib.

Creando arrays en Numpy


Primero, vamos a suponer que para todas las instrucciones subsecuentes, antes se ha importado el
mdulo NumPy utilizando el alias np, como sigue:
1

>>> import numpy as np

La manera bsica de crear un array es utilizando la funcin np.array, a la cual se debe pasar como
argumento una lista de valores numricos para definir un vector o bien una lista de listas para definir
matrices, por ejemplo:
1

>>> X=np.array([1,2,3])

Lo anterior crea un objeto de la clase numpy.ndarray


1
2

>>> type(X)
<type 'numpy.ndarray'>

Para definir una matriz A dada por:

1 2 3
A = 4 5 6
7 8 9
se tiene que pasar una lista de listas como argumento, donde cada sublista representa una fila de la
matriz:
Versin incompleta

11

Lo que hay que saber de NumPy

1
2
3
4
5

>>> A=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> A
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

Esta es la forma manual de crear un array en NumPy, definiendo uno a uno los elementos, lo
cual resultara pesado en arreglos de grandes dimensiones. NumPy proporciona algunas funciones
que permiten crear arrays con valores que siguen un patrn especifico, por ejemplo, valores en un
intervalo [a, b] con incrementos n, o bien cierta cantidad de elementos en un rango, o incluso arreglos
de ceros y unos.
La funcin que ms usaremos en este texto ser linspace, la cual permite crear un array de un cierto
nmero de elementos en un intervalo fijo. Por ejemplo:
1
2

>>> np.linspace(2,10,5)
array([ 2.,
4.,
6.,

8.,

10.])

Lo anterior crea un array de 5 elementos en el intervalo [2, 10].


Otra funcin muy similar es arange, la cual tambin necesita como argumentos los extremos del
intervalo, pero en lugar del nmero de elementos se indica el paso o incremento.
1
2

>>> np.arange(2,10,2)
array([2, 4, 6, 8])

Note que arange no incluye el extremo superior, es decir, toma los valores del intervalo abierto por
la derecha [a, b).

Versin incompleta

12

Pyplot y lo bsico

Pyplot y lo bsico
En el Captulo 2 vimos una introduccin a pylab, un mdulo de matplotlib que integra las utilidades
grficas del mdulo pyplot y de la librera NumPy en un mismo espacio de nombres. El uso de pylab
hace recordar mucho la sintaxis y la filosofa de programacin de MATLAB. Por ello (y por razones
que iremos conociendo posteriormente) en el entorno de Matplotlib es preferible utilizar pyplot
y NumPy cmo mdulos independientes, permitiendo una estructuracin ms limpia de cdigo,
diferenciando la parte de proceso de datos y la de graficacin/visualizacin.
Un cdigo tpico utilizando pylab sera:
1
2
3
4
5
6
7
8
9

from pylab import *


x = linspace(0,10)
y = cos(x)
plot(x,y,lw=2,ls="--")
xlabel("Tiempo (s)")
ylabel("Amplitud (mm)")
show()

Y utilizando pyplot + NumPy?


1
2
3
4
5
6
7
8
9
10

import matplotlib.pyplot as plt


import numpy as np
x = np.linspace(0,10)
y = np.cos(x)
plt.plot(x,y,lw=2,ls="--")
plt.xlabel("Tiempo (s)")
plt.ylabel("Amplitud (mm)")
plt.show()

Ambos cdigos producen exactamente lo mismo.


Ahora veremos una tercera forma (mejorada) de hacer lo anterior:

Versin incompleta

13

Pyplot y lo bsico

1
2
3
4
5
6
7
8
9
10
11
12
13
14

import matplotlib.pyplot as plt


import numpy as np
x = np.linspace(0,10)
y = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,lw=2,ls="--")
ax.set_xlabel("Tiempo (s)")
ax.set_ylabel("Amplitud (mm)")
plt.show()

Y s, en este texto vamos a utilizar esta manera de hacer las cosas, la diferencia?: objetos, mtodos
y esas cosas propias de la programacin orientada a objetos, que nos permitir organizar nuestro
cdigo de una mejor manera, sobre todo cuando este tiende a ser extenso. De manera breve, lo que se
hace es instanciar un objeto de la clase Figure, que es bsicamente el objeto grfico principal o lo que
denominaramos como ventana, y posteriormente se utilizan mtodos de clase para crear un Axes y
utilizar sus mtodos para trazar la grfica correspondiente y las etiquetas o leyendas necesarias.
Para las secciones siguientes se asumir que en todo momento se han importado el mdulo pyplot
y NumPy y que al final del cdigo se ha incluido la instruccin plt.show() para mostrar lo que se ha
graficado.
1
2
3
4
5
6

import matplotlib.pyplot as plt


import numpy as np
# .
# .
# .
plt.show()

Coordenadas rectangulares
Hemos estado utilizando este tipo de grficas en todos los ejemplos anteriores, entendemos por
coordenadas rectangulares aquellas en donde cada punto del plano o espacio est dado por sus
coordenadas (x,y) o (x,y,z) y las cuales hemos tenido hasta en la sopa desde nuestro primer curso de
lgebra en el nivel secundario. Por ahora vamos a tomar el caso bidimensional, y en la mayora de
situaciones vamos a graficar un array que contiene los valores de la variable independiente (digamos
x) contra un array que contiene los valores de la variable dependiente (digamos f(x)), utilizando, claro
est, la funcin plot.
Versin incompleta

14

Pyplot y lo bsico

Por ejemplo supongamos que queremos graficar la funcin f (x) = x2 sin(x) en el intervalo [0, 2].
Primero debemos crear el vector o array de la variable independiente en el intervalo de inters, para
ello podemos utilizar linspace:
1

x = np.linspace(0,2*np.pi)

Enseguida definimos el array de la funcin o variable dependiente:


1

y = (x**2)*(np.sin(x))

Ahora creamos el objeto figure:


1

fig = plt.figure()

Utilizando el mtodo add_subplot del objeto fig creamos el axes a utilizar:


1

ax = fig.add_subplot(111)

Con nuestro axes creado, podemos utilizar el mtodo plot para trazar la grfica correspondiente:
1

ax.plot(x, y)

Finalmente debemos utilizar la instruccin plt.show() para mostrar las grficas que hemos
generado. Juntando todo el cdigo anterior se tiene:
1
2
3
4
5
6
7

x = np.linspace(0,10)
y = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y)

Versin incompleta

15

Pyplot y lo bsico

Etiquetas bsicas (xlabel, ylabel & title)


Naturalmente una grfica sin informacin extra ms que las lneas trazadas es intil desde donde se
vea, porque cuando vamos a graficar algo el objetivo es transmitir informacin legible y en cierto
punto amigable a terceros. Para ello en una grfica se debe incluir informacin acerca de los datos
que estamos representando.
En casi cualquier grfica que veamos en libros, artculos o cualquier otro tipo de publicacin vamos
a tener al menos etiquetados los ejes coordenados, y una ttulo o pequea descripcin que muestre
lo que se representa. Para colocar esa informacin bsica en una grfica, Matplotlib proporciona los
mtodos set_xlabel, set_ylabel y set_title de la clase Axes, que de manera respectiva, colocan
una etiqueta en el eje horizontal, una etiqueta en el eje vertical y un ttulo en la parte superior del
Axes.
En el siguiente cdigo se muestra cmo colocar las etiquetas mencionadas anteriormente:

Versin incompleta

16

Pyplot y lo bsico

1
2
3
4
5
6
7
8
9
10

T = [50, 60, 70, 80, 90, 100, 110, 120]


P = [12, 20, 33, 54, 90, 148, 244, 403]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(T, P)
ax.set_xlabel(u"Temperatura (C)")
ax.set_ylabel(u"Presin (KPa)")
ax.set_title(u"Relacin P-T")

Estilos, colores y grosores de lneas


Estilizar lneas es una cuestin muy comn, puesto que muchas veces es necesario diferenciar una
serie de datos de otra mediante su aspecto. Para ello Matplotlib dispone de algunas utilidades para
proporcionar grosores, colores y estilos a una lnea.
Existen cuatro estilos de lneas en Matplotlib: slida, discontinua, de guin-punto y punteada. Estos
estilos pueden establecerse mediante el keyword argument linestyle.

Versin incompleta

17

Pyplot y lo bsico

1
2
3
4
5
6
7
8
9
10

x = np.linspace(0,10)
y = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,
ax.plot(x,
ax.plot(x,
ax.plot(x,

y, linestyle="-")
y+1, ls="--")
y+2, ls="-.")
y+3, ls=":")

Note que el keyword argument linestyle puede abreviarse como ls y sigue funcionando correctamente.
Los colores de una lnea pueden indicarse utilizando el keyword argument color y pasndole en
este una cadena hexadecimal o bien una tupla de tres valores con los valores correspondientes al
modelo RGB.

Versin incompleta

18

Pyplot y lo bsico

1
2
3
4
5
6
7
8

x = np.linspace(0,10)
y = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, color=(0,1,1))
ax.plot(x, y+1, color="#ff00ff")

El grosor de una lnea se establece mediante el argumento linewidth o su forma abreviada lw.
1
2
3
4
5
6
7
8
9

x = np.linspace(0,10)
y = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, lw=2)
ax.plot(x, y+1, lw=4)
ax.plot(x, y+2, linewidth=6)

Versin incompleta

19

Pyplot y lo bsico

Tanto el color (con ciertas limitaciones) como el estilo pueden especificarse como un tercer
argumento en el mtodo plot sin necesidad de utilizar keyword arguments:
1

ax.plot(x, y, "r--")

Donde lo anterior le indica a Matplotlib que debe trazar una lnea discontinua de color rojo. Sin
embargo est limitado a unos cuantos colores predeterminados que puede encontrar en la siguiente
referencia.

Coordenadas polares
Para trazar grficas en coordenadas polares en Matplotlib se utiliza tambin el mtodo plot, pero
cuando se crea el axes debemos cambiar el tipo de proyeccin que utilizaremos a coordenadas
polares, lo cual puede hacerse de las utilizando el keyword argument projection:
1
2

fig = plt.figure()
polar_axes = fig.add_subplot(111, projection="polar")

O bien utilizando polar:

http://matplotlib.org/api/colors_api.html
Versin incompleta

20

Pyplot y lo bsico

1
2

fig = plt.figure()
polar_axes = fig.add_subplot(111, polar=True)

Por ejemplo, trazando la rosa polar r() = 0.25 cos(3):


1
2
3
4
5
6
7

theta = np.linspace(0,2*np.pi,1000)
r = 0.25*np.cos(3*theta)
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(theta, r)

Scatter Plots
Grficas de barras
Grficas de pastel

Versin incompleta

You might also like