🐍

Matplotlib: Gráficas en Python

TemaMatplotlibPython
TipoTutoriales

Importar librería gráfica (Matplotlib) y Numpy

import numpy as np
import matplotlib.pyplot as plt

Para este ejemplo se trabajarán con las siguientes ecuaciones

f1(x)=xαcos(xα)f1(x) = x^{\alpha}\cos(x^{\alpha})
f2(x,y)=xαcos(xα)+αsin(y)f2(x,y) = x^{\alpha}\cos(x^{\alpha})+\alpha\sin(y)

En Python definimos estas funciones así:

def f1(x,alpha):
    c = x**alpha
    return c*np.cos(c)

def f2(x,y,alpha):
    c = x**alpha # a**b = a^b
    return c*np.cos(c)+alpha*np.sin(y)

Es importante que usemos el seno y cose de Numpy, ya que, esto nos permite trabajar con múltiples datos al tiempo.

Gráficas en 2D

Definamos un limite inferior de la gráfica, un límite superior de la gráfica, un número de datos y un valor para α\alpha

alpha = 2.5
x0 = 0
xf = 1
n = 100

Ahora generamos una serie de datos igualmente espaciados para gráficar. Para ello usamos la finción np.linspace

#Generar datos con Numpy
_x = np.linspace(x0,xf,n)
_y = f1(_x,alpha)

Para poder gráficar usamos el comando plt.plot

plt.plot(_x,_y)
plt.show()

Como resultado se obtiene la siguiente gráfica:

Esta gráfica carece de personalidad, para ello, vamos a decorarla.

....
plt.plot(_x,_y)

plt.grid() #Agregamos grilla a la gráfica
plt.title(r'Grafica de $y = x^{\alpha}\cos(x^{\alpha})$') #Le ponemos título
plt.xlabel('x') #Le ponemos nombre al eje x
plt.ylabel('y') #Le ponemos nombre al eje y


plt.show()

Esto nos genera la siguiente gráfica:

Por último le podemos agregar una leyenda a la línea así:

...
plt.plot(_x,_y,label='alpha=2.5') #Asignamos un label a la línea

plt.legend()
plt.grid()
plt.title(r'Grafica de $y = x^{\alpha}\cos(x^{\alpha})$')
plt.xlabel('x')
plt.ylabel('y')

plt.show()

Lo que genera:

En el comando plt.plot se puede cambiar el estilo de la línea. Por ejemplo, para hacer una linea punteada roja el comando es:

plt.plot(_x,_y, '--', color ='red', label='linea roja') 

Se pueden encontrar una lista de los estilos de linea y de los colores aquí:

Marcadores en matplotlib: https://matplotlib.org/stable/api/markers_api.html

Colores matplotlib https://matplotlib.org/stable/gallery/color/named_colors.html

Para hacer gráifcas con mas de una linea basta con llamar a la función plt.plot varias veces. En este caso, crearemos una gráfica donde cada línea tenga diferente alpha

alphas = [1,1.5,2,2.5,3,3.5]
for alpha in alphas: #For Each
    _y = f1(_x,alpha)
    plt.plot(_x,_y,label=r'$\alpha=$'+format(alpha))
#Decorar
plt.legend()
plt.grid()
plt.title(r'Grafica de $y = x^{\alpha}\cos(x^{\alpha})$')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

Cada línea puede tener un estilo distino (color, grosor, marcador, etc.) Matplotlib por defecto asigna esos colores.

Varias gráficas en una sola figura

En Matplotlib hay muchas formas de hacer subplots,. que básicamente son distintas gráficas en una sola imagen. Para ello hay que hacer la gráfica directamente en cuadros que esten contenidos en una figura (algo extraño). Por ejemplo

fig = plt.figure(figsize=[10,3]) #Creamos una figura de tamaño 10x3 pulgadas


ax = fig.add_subplot(1,3,1) # Agregamos una gráfica en una grilla de 1X3 y esta es la primera gráfica (1,3,1)

ax.plot(_x,f1(_x,1)) #En lugar de plt.plt hacemos ax,plot. Los decoradores se trabajan igual

ax.set_title('Gráfica 1') #Para poner títulos y nombres de ejes hay que usar estos comandos
ax.set_xlabel('x')

ax.grid() #grid y legend no cambian

#Como es una grilla de 1x3 gráficas falta agregar las otras dos. Esto se hace igual 
#que la anterior cambiando el parámetro de ubicación:


ax = fig.add_subplot(1,3,2) #1x3 - 2
ax.plot(_x,f1(_x,3))
ax.set_title('Gráfica 2')
ax.set_xlabel('x')
ax.grid()


ax = fig.add_subplot(1,3,3) #1x3 - 3
ax.plot(_x,f1(_x,6))
ax.set_title('Gráfica 3')
ax.set_xlabel('x')
ax.grid()

plt.show()

En cada gráfica pequeña se pueden poner todos los decoradores y tipos de linea que se deseen.

Gráficas en 3D

Las gráfias en 3D pueden generarse de distintas maneras. En la página https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html hay una referencia completa de todas las opciones.

Para las gráficas en 3D hay que importar una parte adicional de matplotlib que es:

from mpl_toolkits.mplot3d import Axes3D

Para este ejemplo usaremos la función 2 y crearemos los datos así:

X = []
Y = []
Z = []

_x = np.linspace(x0,xf,n)

for i in range(n):
    for j in range(n):
        X.append(_x[i])
        Y.append(_x[j])
        Z.append(f2(_x[i],_x[j],3))

Esto genera una serie de puntos X,Y,Z donde pasará la superficie.

Superficies

Para este caso realizaremos una superficie de triangulos que es la manera mas facil de crear una superficie tridimensional.

Para crear superficies hay que usar figuras de matplotlib así:

fig = plt.figure()

ax = fig.add_subplot(projection='3d') #Decimos que es uan gráfica en 3D

surf = ax.plot_trisurf(X,Y,Z,cmap='magma') ##Graficamos la superficie

fig.colorbar(surf) #Le agregamos una barra de color
plt.show()

El CMAP es el código de color que usará matplotlib para indicar la altura. Hay una gran cantidad de colormaps por defecto: https://matplotlib.org/stable/tutorials/colors/colormaps.html

Para este caso se genera la siguiente gráfica

Contornos

El proceso es el mismo, solo vambia el comando:

fig = plt.figure()
ax = fig.add_subplot() #La proyección no es 3D
ax.tricontourf(X,Y,Z)
plt.show()

En este caso no se le asigno colormap (se puso uno por defecto)

Como son gráficas que estan dentro de figuras, pueden combinarse para crear combinaciones interesantes

fig = plt.figure(figsize=[10,3])
ax = fig.add_subplot(1,2,1,projection='3d')
surf = ax.plot_trisurf(X,Y,Z,cmap='magma')
fig.colorbar(surf)

ax = fig.add_subplot(1,2,2)
surf = ax.tricontourf(X,Y,Z,cmap='magma')

plt.show()