<jupyter_start><jupyter_text>**Matplotlib***** **Editado por: <NAME>** Contacto: <EMAIL> | [Linkedin](https://www.linkedin.com/in/kevin-alexander-g%C3%B3mez-2b0263111/) | [Github](https://github.com/kevinalexandr19)***  **Descripción**Usando este manual, aprenderás a usar Matplotlib, una librería fundamental para la visualización de datos en Python.Este Notebook es parte del proyecto [**Python para Geólogos**](https://github.com/kevinalexandr19/manual-python-geologia), y ha sido creado con la finalidad de facilitar el aprendizaje en Python para estudiantes y profesionales en el campo de la Geología.*** Empezaremos importando el módulo de figuras de `matplotlib` llamado `pyplot`: > Usaremos `plt` como una referencia abreviada del módulo.\> También importaremos `numpy`.<jupyter_code>import matplotlib.pyplot as plt
import numpy as np<jupyter_output><empty_output><jupyter_text>Para los ejemplos de visualización, usaremos las siguientes funciones:- `subplots`: crea el espacio para una o varias figuras ordenadas en filas y columnas.- `scatter`: crea un diagrama de dispersión de puntos.- `plot`: crea una figura de líneas.- `bar`: crea un diagrama de barras.- `hist`: crea un histograma.- `boxplot` y `violinplot`: crean figuras que nos ayudan a visualizar la distribución de los datos.Matplotlib es una librería fuertemente orientada a objetos, por lo tanto, usaremos identificadores.\Para identificar las figuras, usaremos los siguientes nombres:- `fig`: referencia el cuadro general de la figura.- `axs` o `ax`: referencian a las subfiguras creadas.  **1. Diagrama de dispersión**<jupyter_code># Input
x = np.random.randn(1, 50)
y = 3*x + np.random.randn(1, 50)


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
ax.scatter(x, y)

plt.show()<jupyter_output><empty_output><jupyter_text>**2. Figura de líneas**<jupyter_code># Input
x = np.arange(1, 11, 1)
y = x ** 2
z = x ** 3


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Figura de líneas
ax.plot(x, y)
ax.plot(x, z)

plt.show()<jupyter_output><empty_output><jupyter_text>Usaremos además el método `legend` para agregar una leyenda y `fontsize` para modificar el tamaño de letra en la leyenda.\La leyenda usará los valores asignados en el parámetro `label` de cada figura:<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Figura de líneas
ax.plot(x, y, label="$x^{2}$")
ax.plot(x, z, label="$x^{3}$")

# Leyenda
ax.legend(fontsize=16)

plt.show()<jupyter_output><empty_output><jupyter_text>**3. Diagrama de barras**<jupyter_code># Input
x = np.array(["A", "B", "C"])
y = np.random.randint(1, 100, (3,))


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de barras
ax.bar(x, y)

plt.show()<jupyter_output><empty_output><jupyter_text>**4. Histograma**<jupyter_code># Input
x = np.random.randn(10000,)


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Histograma
ax.hist(x, bins=20)

plt.show()<jupyter_output><empty_output><jupyter_text>**5. Boxplot**<jupyter_code># Input
x = np.random.randn(10000,)
y = 2*x + 1
z = 2 - x


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Boxplot
ax.boxplot([x, y, z])

plt.show()<jupyter_output><empty_output><jupyter_text>**6. Violinplot**<jupyter_code># Input
x = np.random.randn(10000,)
y = 2*x + 1
z = 2 - x


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Violinplot
ax.violinplot([x, y, z])

plt.show()<jupyter_output><empty_output><jupyter_text>**7. Detalles adicionales en las figuras** **7.1. Diagrama de dispersión: puntos de tamaño variable**Usaremos el parámetro `s` o `size` de la función `scatter` para modificar el tamaño de los puntos. Este parámetro puede tomar un valor constante o un arreglo de valores.<jupyter_code># Input
x = np.random.randn(1000)
y = 3*x + np.random.randn(1000)
z = np.random.randint(5, 100, (1000))


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
im = ax.scatter(x, y, s=z)

plt.show()<jupyter_output><empty_output><jupyter_text>Para agregar un borde de color a los puntos, usaremos el parámetro `edgecolor` y para agregarles transparencia, usaremos el parámetro `alpha`:<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
im = ax.scatter(x, y, s=z, edgecolor="black", alpha=0.8)

plt.show()<jupyter_output><empty_output><jupyter_text>Empezaremos referenciando la figura en `ax` usando la variable `im`.\Luego, usaremos el método `legend_elements` para obtener los símbolos `handles` y etiquetas `labels` que usaremos en la creación de la leyenda.\Por último, crearemos la leyenda usando la función `legend` y los parámetros mencionados anteriormente.<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
im = ax.scatter(x, y, s=z, edgecolor="black", alpha=0.8)

# Leyenda
handles, labels = im.legend_elements(prop="sizes")
ax.legend(handles, labels)

plt.show()<jupyter_output><empty_output><jupyter_text>**7.2. Diagrama de dispersión: barra de colores**Primero, generaremos un diagrama de dispersión en el cual los puntos `x` e `y` estarán coloreados de acuerdo a un conjunto de datos `z`.\Para esto, utilizaremos un mapa de colores y lo asignaremos a la variable `cmap`.<jupyter_code># Input
x = np.random.randn(1000)
y = 3*x + np.random.randn(1000)
z = np.random.randn(1000)

# Mapa de colores
cmap = plt.cm.inferno


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
im = ax.scatter(x, y, c=z, cmap=cmap, s=50, edgecolor="black")

plt.show()<jupyter_output><empty_output><jupyter_text>Para agregar una barra de colores, usaremos el método `colorbar` y lo asignaremos a una variable llamada `cbar`.\Este método utiliza los siguientes parámetros:- `mappable`: figura de la cual se describirán los colores- `ax` (opcional): la barra puede obtener espacio de una o varias figuras, estas figuras se señalan usando este parámetro<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
im = ax.scatter(x, y, c=z, cmap=cmap, s=50, edgecolor="black")

# Barra de colores
cbar = fig.colorbar(im, ax=ax)

plt.show()<jupyter_output><empty_output><jupyter_text>**7.3. Diagrama de barras: colocar el valor de frecuencia encima de cada barra**Primero, crearemos un diagrama de barras básico:<jupyter_code># Input
x = ["A", "B", "C"]
y = np.random.randint(10, 100, (3,))


# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de barras
ax.bar(x, y)

plt.show()<jupyter_output><empty_output><jupyter_text>Ahora, removeremos los ticks del eje y:<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de barras
ax.bar(x, y)

# Ticks del eje y
ax.set_yticks([])

plt.show()<jupyter_output><empty_output><jupyter_text>Tenemos que remover el cuadro que encierra a la figura:- Usando la función `gca`, obtenemos una referencia del espacio usado en la figura.- A partir de esta referencia, llamamos el atributo `spines`, que corresponde a las líneas del cuadro que encierran la figura.- Luego, usaremos el método `values` para obtener una lista con las referencias de cada uno de los lados del cuadro.- Por último, usaremos un bucle que itere a través de esta lista de lados y a través del método `set_visible(False)` pasarán a estar ocultas en la figura.<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de barras
ax.bar(x, y)

# Ticks del eje y
ax.set_yticks([])

# Removemos el cuadro
for spine in plt.gca().spines.values():
    spine.set_visible(False)

plt.show()<jupyter_output><empty_output><jupyter_text>Ahora que ya removimos algunos elementos innecesarios, colocaremos el texto de la frecuencia encima de cada una de las barras:- Empezaremos referenciando el diagrama de barras usando la variable `barra`.- Luego, usando un bucle, iteraremos a través de cada una de las barras en el diagrama `barra` para colocar el texto.- Usando la función `text`, colocaremos un texto cuyas coordenadas serán extraídas a partir de dos funciones:    - `get_x + get_width / 2` para la coordenada x    - `get_height + 1` para la coordenada y- El string del texto será una transformación de la altura de la barra (pues esta representa la frecuencia).- Por último, centraremos el texto con el parámetro `ha` y agrandaremos el tamaño del texto con `fontsize`.<jupyter_code># Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de barras
barra = ax.bar(x, y)

# Ticks del eje y
ax.set_yticks([])

# Removemos el cuadro
for spine in plt.gca().spines.values():
    spine.set_visible(False)
    
# Texto
for bar in barra:
    ax.text(bar.get_x() + bar.get_width()/2,
            bar.get_height() + 1,
            str(int(bar.get_height())),
            ha="center", fontsize=15)

plt.show()<jupyter_output><empty_output><jupyter_text>**8. Guardar una figura de `matplotlib`**Podemos guardar una figura en diferentes formatos de archivo y usando una resolución de baja o alta calidad.> Nota: usaremos un fondo oscuro en esta imagen para que contraste con el tema oscuro de Jupyter Lab.El formato en el cual podemos guardar una figura puede ser `png`, `jpeg`, `pdf`, `svg`, etc.<jupyter_code># Input
x = np.random.randn(1, 50)
y = 3*x + np.random.randn(1, 50)

# Fondo oscuro en una figura
plt.style.use("dark_background")

# Figura principal
fig, ax = plt.subplots(figsize=(6, 6))

# Diagrama de dispersión
ax.scatter(x, y)

plt.show()<jupyter_output><empty_output><jupyter_text>Una vez creada la figura, podemos usar la función `savefig` sobre la variable `fig` que representa a toda la figura principal.\El parámetro `dpi` (dots per inch) controla la resolución de la figura:<jupyter_code>fig.dpi<jupyter_output><empty_output><jupyter_text>Debemos de tener en cuenta que cuanto más alto es el valor de `dpi`, más tiempo tardará Python en procesar y guardar la imagen.\En este ejemplo, guardaremos la imagen en formato `png` y usando un `dpi` de 144 (el doble).<jupyter_code>fig.savefig("figura.png", dpi=144)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12052375756373376, 'fraction_numerical': 0.016863406408094434, 'mean_word_length': 5.289457267623207, 'pattern_counts': {'":': 0, '<': 83, '<?xml version=': 0, '>': 86, 'https://': 3, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '20', 'dir': 'jupyter-structured-clean-dedup', 'id': '661959', 'license': 'MIT', 'n_tokens_mistral': 4000, 'n_tokens_neox': 3870, 'n_words': 1151, 'path': 'notebooks/1d_matplotlib.ipynb', 'repo_name': 'kevinalexandr19/manual-python-geologia', 'size': '10114'}