You are on page 1of 10

Matplotlib para grficas de alta calidad (Parte 1)

In [5]: from IPython.display import Image


Image('http://matplotlib.org/_static/logo2.png')
Out[5]:

Matplotlib es la biblioteca para crear grficos ms usada en Python. Es un paquete que contiene una gran cantidad
de mdulos para crear grficas en 2D y 3D con calidad de publicacin, es decir, las figuras que genera se pueden usar
en artculos para revistas cientficas de alcance internacional. La pgina web del paquete es http://matplotlib.org/.
Entre todos los mdulos y subpaquetes de matplotlib el ms adecuado para crear grficas es pyplot. Este mdulo
contiene funciones que asemejan a las encontradas en otro sistema de cmputo cientfico llamado MATLAB, de tal
manera que para los usuarios de este sistema Python resulte un ambiete de programacin familiar.
Las libretas de IPython tienen soporte por default para todas las funciones de los paquetes numpy, matplotlib y pyplot.
Esto significa que no es necesario importar las bibliotecas explcitamente:
In [3]: import numpy as np
import matplotlib.pyplot as pyplot
puesto que ya estn precargadas. Tampoco hay que escribir el nombre de los mdulos y el operador punto para
acceder a la funcionalidad. Sin embargo en un programa independiente (un archivo .py) s es necesario, as que vale
la pena remarcarlo.

Un ejemplo sencillo
Matplotlib siempre se usa junto con numpy. Es ms, la primera depende de la segunda. La razn de esto es que los
arreglos multidimensionales de numpy son las estructuras de datos naturales para graficar.
Comencemos con un ejemplo sencillo: la grfica de la funcin matemtica seno f (x) = sin(x) . El dominio de esta
funcin son los nmeros reales, x , y la imagen de la misma son los reales en el intervalo cerrado [1, 1]. Para
graficarla tenemos que escoger un intervalo de su dominio y aplicar a funcin a los puntos de ese intervalo. En Python
lo que regularmente hacemos es tomar un conjunto de puntos igualmente espaciados desde un punto inicial x 0 hasta
un punto final x f , y evaluamos la funcin en esos puntos.
Con numpy ya tenemos una manera de crear un intervalo de puntos igualmente espaciados: la funcin arange, que
acepta tres argumentos posicionales: el primero es el punto inicial, el segundo el punto final, y el tercero el
espaciamiento entre puntos.
In [1]: x0, xf, dx = -30, 30, 0.1
x = arange(x0, xf, dx)
# print x

# Punto inicial, punto final, espaciamiento entre punt

Estos son los puntos donde vamos a evaluar la funcin. En nuestro ejemplo graficaremos la funcin seno.
Ahora bien, antes de continuar recordemos que la variable x es un objeto de tipo ndarray, un array de numpy. Si
queremos aplicar una funcin a los elementos de un array es necesario que las funciones sepan como trabajar con
esos arrays, es decir, que sean capaces de aplicar la funcin elemento por elemento del array x. Para esto numpy
implementa sus propias versiones de las funciones matemticas ms importantes, entre ellas la funcin seno. As,
aplicamos la funcin sin a los elementos del array x y er resultado lo guardamos en una variable y. Esta variable y
corresponde a la funcin evaluada en los puntos de x.
In [2]: y = sin(x)
Con esto tenemos suficiente para crear una figura muy sencilla:
In [3]: title(u'Grfica del f(x) = sin(x)')
xlabel('x')
ylabel('f(x)')
xlim(-10, 10)
ylim(-2, 2)
plot(x, y)
Out[3]:

[<matplotlib.lines.Line2D at 0x7751908>]

Realmente el cdigo se explica slo. Cada una de las funciones usadas para crear la figura pertenecen al mdulo
pyplot, y su funcionalidad es ms que evidente:
La funcin title establece el ttulo de la grfica en una cadena de texto.
xlabel establece la legenda en el eje x .
ylabel es anloga a xlabel, pero para al eje y .
xlim define el intervalo a graficar en el eje x . El primer argumento de la funcin es el lmite inferior. El
segundo es el lmite superior.
ylim es anlogo a xlim para el eje y .
plot se encarga de graficar los datos de inters. El primer argumento que acepta son el conjunto de las
coordenadas x de los puntos a graficar. El segundo argumento son las coordenadas y de los mismos.
Importante: si se quieren escribit ttulos o etiquetas en los ejes con caracteres acentuados hay que escribir
las cadenas de texto con una u antes de la primera comilla que delimita la cadena (o antes de las comillas
dobles). Ejemplo:

In [4]: # Manera recomendada de escribir ttulos con caracteres acentuados y ees en matplotl
texto = u'Grfica de ...'
# O bien
texto = u"Grfica de ..."

Definir el tamao de la figura


Podemos definir el tamao de nuestra figura mediante la funcin figure. A esta funcin hay que pasarle un argumento
nombrado: figsize, que es una tupla con el ancho y el alto de la figura en pulgadas.
In [8]: SIZE = (8, 8)

# Figura de 8x8 pulgadas.

# Ahora creamos la figura con el tamao y dpi especificado.


fig1 = figure(figsize=SIZE)
# El resto del cdigo permanece igual...
title(u'Grfica del f(x) = sin(x)')
xlabel('x')
ylabel('f(x)')
xlim(-10, 10)
ylim(-2, 2)
plot(x, y)
Out[8]:

[<matplotlib.lines.Line2D at 0x7d11438>]

Cambiando el grosor y el color de la grfica.


Para cambiar el color de la curva de la grfica, as como el color de la misma, necesitamos agregar un tercer
argumento a la funcin plot. Este tercer argumento sirve para especificar el color y el tipo de marcadores que se
usaran para cada punto de la grfica. Por ejemplo, el comportamiento por defecto de matplotlib es unir los puntos con
lneas, sin marcadores, con color azul. Para graficar la figura con un marcador circular y color rojo empleamos el tercer
argumento de la forma 'ro', r para indicar color red, o rojo, y o para indicar un marcador circular.
In [30]: pyplot.plot(x, y, 'ro')
Out[30]:

[<matplotlib.lines.Line2D at 0xa1d0588>]

En este ejemplo no definimos cosas como el ttulo o las etiquetas x y y , pero el efecto sobre la grfica est all.
Podemos usar una combinacin de las siguientes letras para definir un color y marcador:
Colores
r: rojo, g: verde, b: azul, c: cyan, m: magenta, y: amarillo, k: negro, w: blanco
Marcadores o: crculo, s: cuadrados, v: tringulo hacia abajo, ^: tringulo hacia arriba, -: lnea slida, --: lnea
punteada, D: diamantes
In [9]: # Lnea con diamantes color cyan
pyplot.plot(x, y, 'cD')
Out[9]:

[<matplotlib.lines.Line2D at 0x8ed50b8>]

La segunda forma de especificar el color y el marcador es indicando la forma del marcador con el argumento nombrado
marker y definir el color con un argumento nombrado, color. En este caso el color tambin es una de las letras
indicadas anteriormente.
In [10]: # Lnea con diamantes color cyan, usando el argumento nombrado color
pyplot.plot(x, y, marker='D', color='c')
Out[10]:

[<matplotlib.lines.Line2D at 0x8efe470>]

El resultado es el mismo que en el primer caso. La ventaja de este mtodo es que el color puede ser especificado en
varios formatos: con las letras indicadas anteriormente, con los nombres completos de los colores (en ingls), por
ejemplo, yellow, mediante notacin hexadecimal, por ejemplo el rojo es #FF0000, o una tupla de tres elementos para
indicar un color RGB (red, green, blue), por ejemplo, el rojo es (1, 0, 0):
In [11]: # Lnea con diamantes color rojo, usando color en hexadecimal
pyplot.plot(x, y, marker='D', color='#FF0000')
Out[11]:

[<matplotlib.lines.Line2D at 0x91067b8>]

In [12]: # Lnea con diamantes color cyan, usando color en RGB


pyplot.plot(x, y, marker='D', color=(1, 0, 0))
Out[12]:

[<matplotlib.lines.Line2D at 0x948bba8>]

La mayora del tiempo es suficiente especificar el color con una letra, sin embargo en grficos ms sofisticados puede
ser necesario recurrir a colores en otra notacin. En internet hay sitios que nos permiten elegir colores de manera
visual, y stos generan el valor del color seleccionado tanto en hexadecimal o RGB. Por ejemplo, en este enlace se
muestran algunos colores en ambas notaciones. Usemos uno de los colores definidos all: #CC3399.
In [13]: # Lnea con diamantes color cyan, usando color en RGB
pyplot.plot(x, y, marker='D', color='#CC3399')
Out[13]:

[<matplotlib.lines.Line2D at 0x94b5e48>]

El grosor de las lneas que unen los marcadores est definida por el argumento nombrado linewidth, o lw. El valor
de este puede tomar valores reales positivos.
In [14]: # Lnea con diamantes color cyan, usando color en RGB
pyplot.plot(x, y, marker='D', color='#CC3399', linewidth=10)
Out[14]:

[<matplotlib.lines.Line2D at 0x9865240>]

Out[14]:

[<matplotlib.lines.Line2D at 0x9865240>]

Mostrando el cuadriculado
Podemos activar el cuadriculado de la grfica con la funcin grid, pasndole el valor True para mostrarlo, o False
para desactivarlo.
In [40]: SIZE = (6, 6)

# Figura de 6x6 pulgadas.

# Ahora creamos la figura con el tamao y dpi especificado.


fig1 = figure(figsize=SIZE)
grid(True)
# El resto del cdigo permanece igual...
title(u'Grfica del f(x) = sin(x)')
xlabel('x')
ylabel('f(x)')
xlim(-10, 10)
ylim(-1.5, 1.5)
plot(x, y)
Out[40]:

[<matplotlib.lines.Line2D at 0xc06e320>]

Cambiando el tamao del texto


Hay varias forman de cambiar el tamao de los elementos de una grfica. A nivel global se definen los parametros base
con la funcin rc, la cual acepta un argumento posicional, que indica sobre que elementos en general se van a
especificar el estilo, y varios argumentos nombrados para especificar el valor de los estilos. Por ejemplo, para definir el
tamao del texto usaramos la siguiente instruccin:
In [15]: rc('font', size=20)
El tamao del texto se especifica en el argumento nombrado size, que es un nmero positivo, de preferencia entero,
que indica el tamao del texto en puntos.
In [31]: SIZE = (6, 6)

# Figura de 10x10 pulgadas.

# Ahora creamos la figura con el tamao y dpi especificado.


fig1 = figure(figsize=SIZE)
title(u'Grfica del f(x) = sin(x)')
xlabel('x')
ylabel('f(x)')
xlim(-10, 10)
ylim(-1.5, 1.5)
plot(x, y, marker='D', color='#CC3399')
Out[31]:

[<matplotlib.lines.Line2D at 0xac07908>]

Tamaos de ttulos y legendas de los ejes


Matplotlib tiene varias capas encargadas de crear los grficos, y diversos elementos organizados segn su
generalidad. As el elemento que contiene a todos los dems elementos que forman una figura es el contenedor
Figure. Dentro de este contenedor existen varios elementos de tipo Artist, que se encargan de crear otros grficos.
Otro contenedor muy importante es Axes, el cual incluye, en particular, a las leyendas y el ttulo de la figura. La
documentacin detallada de cmo funciona matplotlib es muy extensa, aunque vale la pena darle una revisada. Esta se
encuentra en http://matplotlib.org/contents.html.
Explicado lo anterior, para cambiar el tamao del ttulo y las leyendas se emplea la misma funcin rc, slo que sobre el
elemento axes:
In [25]: rc('font', size=12)
rc('axes', titlesize=20, labelsize=18)
El argumento nombrado titlesize define el tamao del ttulo, mientras que labelsize hace lo mismo con las
leyendas en los ejes x y y . Son nmeros positivos, de preferencia enteros.
In [26]: SIZE = (6, 6)

# Figura de 6x6 pulgadas.

# Ahora creamos la figura con el tamao y dpi especificado.


fig1 = figure(figsize=SIZE)
title(u'Grfica del f(x) = sin(x)')
xlabel('x')
ylabel('f(x)')
xlim(-10, 10)
ylim(-1.5, 1.5)
plot(x, y, marker='D', color='#CC3399')
Out[26]:

[<matplotlib.lines.Line2D at 0xa4ac7f0>]

Podemos incluso definir el color del texto en las leyendas con el argumento nombrado labelcolor:
In [30]: rc('axes', titlesize=20, labelsize=18, labelcolor='green')
SIZE = (6, 6)

# Figura de 6x6 pulgadas.

# Ahora creamos la figura con el tamao y dpi especificado.


fig1 = figure(figsize=SIZE)
title(u'Grfica del f(x) = sin(x)')
xlabel('x')
ylabel('f(x)')
xlim(-10, 10)
ylim(-1.5, 1.5)
plot(x, y, marker='D', color='#CC3399')
Out[30]:

[<matplotlib.lines.Line2D at 0xa733f60>]

Desafortunadamente no se puede hacer lo mismo con el ttulo.

Utilidades en lnea para elegir colores


Para crear colores de manera sencilla se pueden utilizar herramientas en lnea. Una muy buena herramienta es Adobe
Kuler, que a pesar de ser algo compleja tambin es muy fcil de usar. Para usarlo hay que ir a este sitio.
In [ ]:

You might also like