Matplotlib: Gráficas en Python
Tema | MatplotlibPython |
---|---|
Tipo | Tutoriales |
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
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 = 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.
- Grillas
- Titulos (para poner títulos con latex se usa r'$CODIGO LATEX$'
....
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:

Código hasta el momento
import numpy as np import matplotlib.pyplot as plt 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) alpha = 2.5 x0 = 0 xf = 1 n = 100 # Generar datos con Numpy _x = np.linspace(x0, xf, n) _y = f1(_x, alpha) 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()
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()
