Matplotlib es la libreria ejemplar para la visualización de información en Python. Fue creada por John Hunter con la intención de replicar las capacidaddes para graficar de MatLab.
Es una excelente libreria para graficar 2D y 3D así como para generar figuras cientificas
Algunas de las ventajas de Matplotlib son:
Matplotlib nos permite reproducir graficas programaticamente. como recomencion pueden checar la pagina oficial de Matplotlib en http://matplotlib.org/
Necesitamos instalar primeramente matploblib con el siguiente comando
conda install matplotlib
Importar el modulo matplotlib.pyplot con el nombre plt:
In [4]:
import matplotlib.pyplot as plt
Para la visualizar las graficas en linea ocupamos el codigo:
In [5]:
%matplotlib inline
Esta linea de codigo solo es necesaria para los cuadernos de jupyter, si estas usando algun otro editor, deberas de usar el comando plt.show() para visualizar la grafica en otra ventana
Utilizando dos arreglos de numpy, podemos generar una grafica
In [6]:
import numpy as np
x = np.linspace(0, 5, 11)
y = x ** 2
In [7]:
x
Out[7]:
In [8]:
y
Out[8]:
In [10]:
plt.plot(x, y, 'r') # 'r' es el color rojo
plt.xlabel('Titulo eje X')
plt.ylabel('Titulo eje Y')
plt.title('Titulo de la grafica')
plt.show()
In [11]:
# plt.subplot(nrows, ncols, plot_number)
plt.subplot(1,2,1)
plt.plot(x, y, 'r--') # Opciones de color
plt.subplot(1,2,2)
plt.plot(y, x, 'g*-');
El proposito de utilizar un metodo orientado a objeto es generar un objeto figura y de ahi solo mandar llamar los metodos o atributos del objeto. Este metodo es mas efectivo al momento de manipular varias graficas
Comencemos creando la instancia de figura. Posteriormente crearemos los ejes
In [12]:
# Crear Figura (espacio vacio)
fig = plt.figure()
# Agregar ejes
axes = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # izquierda, abajo, ancho, alto (rango de 0 a 1)
# Graficar los ejes
axes.plot(x, y, 'b')
axes.set_xlabel('Etiqueta X ') # Utilizamos set_ al principio de los metodos
axes.set_ylabel('Etiqueta Y')
axes.set_title('Titulo')
Out[12]:
El codigo es un poco mas complicado, pero tiene la ventaja de que tenemos el control de donde colocar las graficas.
In [13]:
# Crear espacio en blanco
fig = plt.figure()
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # ejes principales
axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # ejes insertados
# Figura grande eje 1
axes1.plot(x, y, 'b')
axes1.set_xlabel('X_etiqueta_eje1')
axes1.set_ylabel('Y_etiqueta_eje1')
axes1.set_title('Eje 1 Titulo')
# Figura insertada eje 2
axes2.plot(y, x, 'r')
axes2.set_xlabel('X_etiqueta_eje2')
axes2.set_ylabel('Y_etiqueta_eje2')
axes2.set_title('Eje 2 Title');
In [15]:
# Usamos una sintaxis similar a plt.figure() excepto que utilizamos una tupla para tomar los valores de fig y axes
fig, axes = plt.subplots()
# Utilizamos el objeto axes para agregar las graficas
axes.plot(x, y, 'r')
axes.set_xlabel('x')
axes.set_ylabel('y')
axes.set_title('Titulo');
The esta manera se puede especificar el numero de filas y columnas a crear al momento de crear el objeto
In [19]:
# Espacio vacio de 1 por 2 subplots
fig, axes = plt.subplots(nrows=1, ncols=2)
In [25]:
# Los ejes es un arreglo de ejes donde se puede graficar
axes
Out[25]:
Se puede iterar en los ejes
In [21]:
for ax in axes:
ax.plot(x, y, 'b')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Titulo')
# Mostrar el objeto figura
fig
Out[21]:
Un error comun en matplotlib es cuando se empalman las graficas y subgraficas, para ello se puede utilizar los metodos fig.tight_layout() o plt.tight_layout() los cuales automaticamentes ajustan las posiciones de los ejes para evitar que estos se empalmen.
In [22]:
fig, axes = plt.subplots(nrows=1, ncols=2)
for ax in axes:
ax.plot(x, y, 'g')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('title')
fig
plt.tight_layout()
Matplotlib permite el uso de aspect ratio, DPI and figure size para ser especificado al momento de crear el objeto. Podemos utilizar figsize
y dpi
comandos
figsize
es una tupla que nos permite determinar el ancho y la altura de la figura en pulgadasdpi
son los puntos por pulgada (pixel per inch). Por ejemplo:
In [23]:
fig = plt.figure(figsize=(8,4), dpi=100)
Estos argumentos se pueden pasar al administrador del layout como una funcion subplots
:
In [24]:
fig, axes = plt.subplots(figsize=(12,3))
axes.plot(x, y, 'r')
axes.set_xlabel('x')
axes.set_ylabel('y')
axes.set_title('Titulo');
Para guardar la figura en un archivo utilizamos el metodo savefig
en la clase Figure
:
In [25]:
fig.savefig("NombreDelArchivo.png")
En este metodo podemos opcionalmente especificar el DPI y seleccionar los diferentes formatos:
In [69]:
fig.savefig("NombreDelArchivo.png", dpi=200)
Ahora que ya tenemos una idea de lo basico al momento de crear una figura, vamos a ver como podemos decorar nuestras graficas
Titulos de la figura
Un titulo puede ser agregado a cada eje de la figurapara emplearlo utiliza el metodo set_title
:
In [26]:
ax.set_title("title");
Etiquetas de los ejes
Igual que con los metodos set_xlabel
y set_ylabel
podemos agregar etiquetas para X y Y
In [42]:
ax.set_xlabel("x")
ax.set_ylabel("y");
Se puede utilizar el metodo legend para mostrar los elementos de la figura
In [30]:
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.plot(x, x**2, label="x**2")
ax.plot(x, x**3, label="x**3")
ax.legend()
Out[30]:
Si deseamos colocar la leyenda a nuestro gusto podemos utilizar los siguientes atributos
In [35]:
# Opciones
ax.legend(loc=1) # upper right corner
ax.legend(loc=2) # upper left corner
ax.legend(loc=3) # lower left corner
ax.legend(loc=4) # lower right corner
# La opcion mas comun
ax.legend(loc=0) # Matplotlib decide por default
fig
Out[35]:
Con matplotlib, podemos definir el color y el tipo de linea mediante la sintaxis de MATLAB, ejemplo 'b'
significa blue, 'g'
significa verde, etc.
In [36]:
# MATLAB Sintaxis
fig, ax = plt.subplots()
ax.plot(x, x**2, 'b.-') # linea azul con puntos
ax.plot(x, x**3, 'g--') # linea verde de lineas
Out[36]:
Podemos definir los colores por medio de sus nombres o los codigos RGB hex y opcionalmente proporcionar un valor alpha con los metodos color
y alpha
. Alpha indica la opacidad.
In [37]:
fig, ax = plt.subplots()
ax.plot(x, x+1, color="blue", alpha=0.5) # medio transparente
ax.plot(x, x+2, color="#8B008B") # RGB hex code
ax.plot(x, x+3, color="#FF8C00") # RGB hex code
Out[37]:
Para cambiar el ancho de la linea podemos utilizar el metodo linewidth
o lw
. El estilo de linea lo podemos modificar con el metodo linestyle
o ls
In [38]:
fig, ax = plt.subplots(figsize=(12,6))
ax.plot(x, x+1, color="red", linewidth=0.25)
ax.plot(x, x+2, color="red", linewidth=0.50)
ax.plot(x, x+3, color="red", linewidth=1.00)
ax.plot(x, x+4, color="red", linewidth=2.00)
# Tipos de linea ‘-‘, ‘–’, ‘-.’, ‘:’, ‘steps’
ax.plot(x, x+5, color="green", lw=3, linestyle='-')
ax.plot(x, x+6, color="green", lw=3, ls='-.')
ax.plot(x, x+7, color="green", lw=3, ls=':')
# configuracion de espacios
line, = ax.plot(x, x+8, color="black", lw=1.50)
line.set_dashes([5, 10, 15, 10]) # formato: longitud de linea, longitud de espacio
# Simbolos de marcas: marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ...
ax.plot(x, x+ 9, color="blue", lw=3, ls='-', marker='+')
ax.plot(x, x+10, color="blue", lw=3, ls='--', marker='o')
ax.plot(x, x+11, color="blue", lw=3, ls='-', marker='s')
ax.plot(x, x+12, color="blue", lw=3, ls='--', marker='1')
# marker size and color
ax.plot(x, x+13, color="purple", lw=1, ls='-', marker='o', markersize=2)
ax.plot(x, x+14, color="purple", lw=1, ls='-', marker='o', markersize=4)
ax.plot(x, x+15, color="purple", lw=1, ls='-', marker='o', markersize=8, markerfacecolor="red")
ax.plot(x, x+16, color="purple", lw=1, ls='-', marker='s', markersize=8,
markerfacecolor="yellow", markeredgewidth=3, markeredgecolor="green");
En esta seccion vamos a ver como controlar el tamano y algunas propiedades de una figura de Matplotlib
Podemos configurar los rangos de cada uno de los ejes con los metodos set_ylim
y set_xlim
en el objeto axes, o axis('tight')
para un rango automatizado
In [43]:
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
axes[0].plot(x, x**2, x, x**3)
axes[0].set_title("Rangos por default")
axes[1].plot(x, x**2, x, x**3)
axes[1].axis('tight')
axes[1].set_title("tight axes")
axes[2].plot(x, x**2, x, x**3)
axes[2].set_ylim([0, 60])
axes[2].set_xlim([2, 5])
axes[2].set_title("rangos manipulados");
In [44]:
plt.scatter(x,y)
Out[44]:
In [45]:
from random import sample
data = sample(range(1, 1000), 100)
plt.hist(data)
Out[45]:
In [46]:
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# graficas de cuadros
plt.boxplot(data,vert=True,patch_artist=True);
In [ ]: