# -*- coding: utf-8 -*-
"""Python TOTAL - Matplotlib.ipynb

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/1CqTZeTV1_gEcvQEVFOVdUh1Ibcf1HcS0

# Práctica de la librería Matplotlib

En este notebook, se desarrollarán una serie de tareas utilizando la librería Matplotlib, empleada para la visualización de datos mediante gráficos.

Se proponen y documentan posibles formas de resolver los ejercicios, pero pueden existir varias formas de lograr los mismos resultados.

Siempre es una buena idea verificar la [Documentación Oficial de Matplotlib](https://matplotlib.org/stable/index.html), donde es posible encontrar todo tipo de información referida a esta librería. Y si te quedas trabado, busca en Google "como hacer [algo] con Matplotlib". Hay enormes probabilidades de que esa pregunta ya haya sido respondida!

Por ejemplo, si quieres crear un gráfico con `plt.subplots()`, puedes buscar directamente en Google [`plt.subplots()`](https://www.google.com/search?q=plt.subplots())
"""

# Commented out IPython magic to ensure Python compatibility.
# Importamos el módulo de Matplotlib como plt
import matplotlib.pyplot as plt

# La siguiente linea nos permite ver los gráficos directamente al ejecutarlos en el notebook
# %matplotlib inline

# Creamos un gráfico utilizando plt.plot()
plt.plot()

# Graficamos una lista de números
a = [1,5,3,8,7,15]
plt.plot(a)

# Creamos dos listas, x e y. Llenamos a la lista x de valores del 1 al 100. 
x = list(range(101))

# Los valores de y van a equivaler al cuadrado del respectivo valor en x con el mísmo índice
y = []
for numero in x:
  y.append(numero**2)

# Graficamos ambas listas creadas
plt.plot(x,y)

"""Hay otra manera de crear gráficos en Matplotlib, utilizando el método orientado a objetos (OO)."""

# Creamos el gráfico utilizando plt.subplots()
# fig se refiere a la figurar general
# ax se refiere al eje
fig, ax = plt.subplots()

ax.plot(x, y)

"""Veamos cómo sería un flujo de trabajo en Matplotlib"""

# Commented out IPython magic to ensure Python compatibility.
# Importar y preparar la librería
import matplotlib.pyplot as plt
# %matplotlib inline

# Preparar los datos
x = list(range(101))
y = []
for numero in x:
  y.append(numero**2)

# Preparamos el área del gráfico (fig) y el gráfico en sí (ax) utilizando plt.subplots()
fig, ax = plt.subplots()

# Añadimos los datos al gráfico
ax.plot(x, y)

# Personalizamos el gráfico añadiendo título al gráfico y a los ejes x e y
ax.set(title="Gráfico de casos de COVID-10 en Latam", xlabel="Días", ylabel="Casos confirmados")

# Guardamos nuestro gráfico empleando fig.savefig()
fig.savefig("/ejemplo-grafico-covif.png")

"""Veamos ahora un gráfico de dispersión:"""

#creamos un nuveo set de datos utilizando la librería Numpy
import numpy as np

x_1 = np.linspace(0, 100, 20)
y_1 = x_1**2

# Creamos el gráfico de dispersión de x vs y
fig, ax = plt.subplots()
ax.scatter(x_1, y_1)

ax.set(title="Otro gráfico más", xlabel="Días", ylabel="Aumento exponencial")

# Visualizamos ahora la función seno, utilizando np.sin(X)
fig, ax = plt.subplots()
x_2 = np.linspace(-10, 10, 100)
y_2 = np.sin(x_2)

ax.scatter(x_2, y_2)

"""Veamos ahora otro tipo de gráfico. Por ejemplo, un gráfico de barras, que por lo general asocia resultados numéricos a variables categóricas (categorías)"""

# Creemos un diccionario con tres platos y su respectivo precio 
# Las claves del diccionario serán los nombres de las comidas, y los valores asociados, su precio
comidas = {"lasagna":350, "sopa":150, "roast beef":650}

# Crearemos un gráfico de barras donde el eje x está formado por las claves del diccionario,
# y el eje y contiene los valores.
fig, ax = plt.subplots()
ax.bar(comidas.keys(), comidas.values())


# Añadimos los títulos correspondientes
ax.set(title="Precios de comidas", xlabel="Comidas", ylabel="Precios")

# Probemos a continuación con un gráfico de barras horizontales
fig, ax = plt.subplots()
ax.barh(list(comidas.keys()), list(comidas.values()))

ax.set(title="Precios de comidas", xlabel="Precios", ylabel="Comidas")

"""Un gráfico semejante es un histograma. Podemos generar números aleatorios que siguen una distribución normal (que se acumulan en torno a un valor central), con la función randn:"""

# Creamos una distribución de 1000 valores aleatorios distribuidos normalmente
x = np.random.random(1000)

# Creamos el histograma
fig, ax = plt.subplots()
ax.hist(x)

"""Veamos ahora un caso más complejo, trabajando con subplots, o figuras que cotienen varios gráficos:"""

# Creamos una figura con 4 subgráficos (2 por fila)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(12,8))

"""Añadimos datos a cada uno de los gráficos (axes)"""

# Creamos la misma disposición de gráficos, con un tamaño de figura de 10x5
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10,5))

# Para nuestro primer gráfico, tomamos el conjunto x_1, y_1, y generamos un gráfico de líneas
ax1.plot(x_1, y_1)


# Para nuestro segundo gráfico, tomamos el conjunto x_2, y_2, y generamos un gráfico de dispersión
ax2.scatter(x_2,y_2)

# Creamos un gráfico con los precios de tres comidas en la esquina inferior izquierda
ax3.bar(comidas.keys(), comidas.values())

# El gráfico de la esquina inferior derecha será un histograma de valores aleatorios con distribución normal
ax4.hist(np.random.randn(1000))

"""Matplotlib tiene un conjunto de varios estilos disponibles, podemos verificarlos de la siguiente manera:"""

# Verificamos estilos disponibles
plt.style.available

# Cambiamos el estilo predeterminado por "seaborn-whitegrid"
plt.style.use('seaborn-v0_8-whitegrid')

"""Habiendo cambiado el estilo (el cambio más evidente que veremos será una grilla en el fondo de cada gráfico), cambiaremos también los colores de las líneas, puntos y barras en cada uno de los gráficos por códigos hex a nuestra preferencia:

"""

# Copiamos los valores de los gráficos anteriores
# Creamos la misma disposición de gráficos, con un tamaño de figura de 10x5
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10,5))

# Para nuestro primer gráfico, tomamos el conjunto x_1, y_1, y generamos un gráfico de líneas
ax1.plot(x_1, y_1, color="#fcba03")


# Para nuestro segundo gráfico, tomamos el conjunto x_2, y_2, y generamos un gráfico de dispersión
ax2.scatter(x_2,y_2, color="#fcba02")

# Creamos un gráfico con los precios de tres comidas en la esquina inferior izquierda
ax3.bar(comidas.keys(), comidas.values(), color="#03c6fc")

# El gráfico de la esquina inferior derecha será un histograma de valores aleatorios con distribución normal
ax4.hist(np.random.randn(1000), color="#fc036b")