3 de febrero de 2013

Exportar gráficas

Muchas de las gráficas que realizamos con matplotlib son usadas como parte de escritos científicos, estadísticos o de cualquier otra índole por lo que en esta entrada veremos como podemos exportar estas gráficas en archivos de imágenes.

La primera opción seria usar el botón guardar que se encuentra en la ventana que se crea al momento de  graficar.


Evidentemente esta es la opción mas fácil si tenemos pocas imágenes para exportar, sin embargo, si queremos realizar operaciones como guardar muchas imágenes, o poner nombres en secuencia, o guardar imágenes sin verlas primero este método no resulta ser muy efectivo. 

Otra forma de exportar una gráfica creada con matplotlib es haciendo uso de la instrucción savefig.

import numpy as np
import matplotlib.pyplot as plt

plt.plot([2, 7, 3, 1, 4])
plt.savefig('imagen.png')

El código anterior nos crea la siguiente imagen con formato png en la misma ruta donde se encuentra el script que utilizamos para crear y guardar la imagen.


Podemos ver como la extensión del archivo es definida junto al nombre de la imagen en un solo string.

De esta manera podemos realizar programas un poco mas complejos como el siguiente


import numpy as np
import random
import matplotlib.pyplot as plt

for i in range(1,11):
    datos = [random.randint(-10,10) for j in range(0,100)]
    #Lista por comprension que genera los datos de cada grafica.
    #Generamos 100 datos aleatorios entre -10 y 10 para cada grafica
    plt.title('Imagen #{0}'.format(i))
    plt.xlabel('Muestras')
    plt.ylabel('Amplitud')
    plt.axis([0, 100, -15, 15]) #[xmin, xmax, ymin, ymax]
    plt.plot(datos)
    plt.savefig('imagen{0}.png'.format(i))
    print 'Imagen {0} lista'.format(i)
    plt.clf() #Quita la figura actual para que no interfiera con la siguiente

El programa anterior genera 10 gráficas cada una con datos diferentes de forma aleatoria y las guarda en disco


La función savefig cuenta con algunos argumentos que pueden ser de ayuda como por ejemplo transparent el cual recibe un valor boleano (True o False) y determina si la gráfica tiene un fondo o es completamente transparente. Esto es especialmente util si se desea insertar la gráfica en una pagina con fondo de algún color y no se quiere dejar la gráfica con un fondo blanco.


plt.savefig('imagen.png', transparent=True)


Imagen transparente sobre un fondo negro

Para mas información sobre los argumentos que puede recibir la función savefig podemos ver la documentación de matplotlib sobre esta.

30 de enero de 2013

Cuadro de etiquetas

En una gráfica es de vital importancia especificar que significa cada una de las lineas que se pueden visualizar. Para esto, vamos a utilizar la función legend la cual nos permite agregar etiquetas a cada una de la lineas que se encuentran en una figura.

import matplotlib.pylab as plt
import numpy as np

x = np.arange(-5,5,0.1)

f1 = np.sin(x)
f2 = np.cos(x)

plt.plot(x,f1, label='seno')
plt.plot(x,f2, label='coseno')

plt.legend()
plt.grid()
plt.show()

Y obtendríamos una gráfica así:


Como podemos ver, en el cuadro se listan las lineas dibujadas con su respectivo color y forma (en el caso  en que hubiéramos puesto lineas punteadas). También observamos que el cuadro con las etiquetas se ubico en la parte superior derecha la cual es la posición por defecto pero como vemos en la siguiente gráfica no siempre es la mejor opción.

Por suerte, podemos elegir la posición en la que deseamos ubicar el cuadro de etiquetas si la posición por defecto no nos convence usando el argumento con palabra clave loc el cual puede tomar los siguientes valores ya sea en forma de cadena de texto o como entero:

Cadena Entero Ubicación
'best' 0 -----> Mejor posición
'upper right' 1 -----> Superior derecha
'upper left' 2 -----> Superior izquierda
'lower left' 3 -----> Inferior izquierda
'lower right' 4 -----> Inferior derecha
'right' 5 -----> Derecha (es la misma que la 7)
'center left' 6 -----> Centro izquierda
'center right' 7 -----> Centro derecha
'lower center' 8 -----> Inferior centro
'upper center' 9 -----> Superior centro
'center' 10 -----> Centro

Según la tabla anterior si queremos que el cuadro de etiquetas se ubique en la parte central superior podemos poner la función legend tanto así

plt.legend(loc='upper center')

Como así

plt.legend(loc=9)

Y obtendríamos el mismo resultado:


De manera alternativa podemos especificar las coordenadas especificas donde queramos que se ubique el cuadro usando una tupla con dos valores entre 0 y 1 de la siguiente manera:

plt.legend(loc=(0.5,0.5))

Como en un semiplano cartesiano, la coordenada (0,0) ubicaría el cuadro en la posición inferior derecha, la coordenada (1,0) lo pondría en la parte inferior derecha por fuera de la gráfica (notese como el referente de ubicación del cuadro es la esquina inferior izquierda del mismo) de lo cual podemos inferir que podemos utilizar coordenadas que se encuentren fuera del rango entre 0 y 1 pero no seria de mucha utilidad.
Gráfica con el cuadro de etiquetas ubicado en la coordenada (1,0)