Practica Visualización con Matplotlib y Plotly - Solución

Curso Python para Ciencia de datos

Por Jose R. Zapata - https://joserzapata.github.io/

Invítame a un Café

NOTA: Realizar Primero los ejercicios y luego revisar las soluciones propuestas.

Para realizar los ejercicios prácticos de este capitulo, hacer click en el siguiente enlace que los llevara a Google Colab, donde podrán ejecutar el código y realizar los ejercicios propuestos.

Ejercicios Visualización - click para abrir en colab

Graficas con MATPLOTLIB

Siga las instrucciones para recrear los plots usando esta información:

Datos

import pandas as pd

# importar el dataset
pinguinos_df = pd.read_csv(
    "https://github.com/mwaskom/seaborn-data/raw/master/penguins.csv"
)

# obtener los valores de la columna "body_mass_g"
masa_corporal = pinguinos_df["body_mass_g"].values
longitud_aleta = pinguinos_df["flipper_length_mm"].values

# verificar que es un array de numpy
type(masa_corporal)
numpy.ndarray

Importe matplotlib.pyplot como plt

import matplotlib.pyplot as plt
  • Grafica (y) en esos ejes y establece las etiquetas y títulos para que coincidan con el siguiente diagrama:
# CÓDIGO AQUÍ
plt.plot(masa_corporal)
plt.title("Masa corporal de los pinguinos")
plt.ylabel("Masa corporal (g)")
plt.show()

png

Use plt.subplots(nrows=1, ncols=2) para crear la grafica siguiente

Tip: al final agregue plt.tight_layout() para que no se superpongan las graficas

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.subplot(1, 2, 1)  # subplot fila=1 Col=2, grafica=1

plt.subplot(1, 2, 2)  # subplot fila=1 Col=2, grafica=2
plt.tight_layout()  # para que no se superpongan los graficos

png

Ahora grafique (masa_corporal) y (longitud_aleta) en los subplot. Juegue un poco con el ancho y el tipo de lineas.

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.subplot(1, 2, 1)  # subplot fila=1 Col=2, grafica=1
plt.plot(masa_corporal, "y.-")
plt.title("Masa corporal")
plt.ylabel("Masa corporal (g)")
plt.subplot(1, 2, 2)  # subplot fila=1 Col=2, grafica=2
plt.plot(longitud_aleta, "g")  # ; zpara no mostrar info de la función
plt.title("Longitud de la aleta")
plt.ylabel("Longitud de la aleta (mm)")
plt.tight_layout()  # para que no se superpongan las graficas;

png

Vea si puede cambiar el tamaño de la gráfica agregando el argumento figsize() en plt.subplots(), Ademas cambie el tipo de linea para que coincida el tipo de las lineas.

copie, pegue y modifique su código anterior.

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)  # subplot fila=1 Col=2, grafica=1
plt.plot(masa_corporal, "b*-")
plt.title("Masa corporal")
plt.ylabel("Masa corporal (g)")
plt.subplot(1, 2, 2)  # subplot fila=1 Col=2, grafica=2
plt.plot(longitud_aleta, "r:")  # ; zpara no mostrar info de la función
plt.title("Longitud de la aleta")
plt.ylabel("Longitud de la aleta (mm)")
plt.tight_layout()  # para que no se superpongan las graficas;

png


Graficas con PANDAS

Cuando se trabaja con datos y estan en un Dataframe, es mas facil usar las funciones de graficacion de Pandas.

Pero matplotlib sigue siendo util cuando se necesita mas control sobre la grafica.

Use los datos del dataframe pinguinos_df para replicar las graficas siguientes:

# importe las librerias necesarias

import matplotlib.pyplot as plt
import pandas as pd
pinguinos_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 344 entries, 0 to 343
Data columns (total 7 columns):
 #   Column             Non-Null Count  Dtype
---  ------             --------------  -----
 0   species            344 non-null    object
 1   island             344 non-null    object
 2   bill_length_mm     342 non-null    float64
 3   bill_depth_mm      342 non-null    float64
 4   flipper_length_mm  342 non-null    float64
 5   body_mass_g        342 non-null    float64
 6   sex                333 non-null    object
dtypes: float64(4), object(3)
memory usage: 18.9+ KB
pinguinos_df.head()

speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
0AdelieTorgersen39.118.7181.03750.0MALE
1AdelieTorgersen39.517.4186.03800.0FEMALE
2AdelieTorgersen40.318.0195.03250.0FEMALE
3AdelieTorgersenNaNNaNNaNNaNNaN
4AdelieTorgersen36.719.3193.03450.0FEMALE

Recrear la gráfica de dispersión (scatter plot) de los valores bill_length_mm vs bill_depth_mm. El color va depender de la variable flipper_length_mm y el tamaño de los puntos se pondran de forma manual. También tenga en cuenta el tamaño de la figura. Vea si puede descubrir cómo estirarlo de una manera similar.

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df.plot.scatter(
    x="bill_length_mm",
    y="bill_depth_mm",
    c="flipper_length_mm",
    s=20,
    title="Relación entre el largo y ancho del pico",
    figsize=(12, 3),
);

png

Cree un histograma de los datos de la columna bill_length_mm con 30 bins. Tengo en cuenta el titulo de la grafica

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df["bill_length_mm"].plot.hist(
    bins=30,
    title="Distribución del largo del pico",
);

png

Estos plots están bien, pero no se pueden cambiar el estilo. Utilice hojas de estilo para establecer el estilo en ‘ggplot’ y vuelva a hacer el histograma desde arriba con transparencia (alpha) de 0.5 y 50 bins.

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.style.use("ggplot")

pinguinos_df["bill_length_mm"].plot.hist(
    bins=50,
    alpha=0.5,
    title="Distribución del largo del pico",
);

png

Crear un boxplot comparando las columnas bill_length_mm, bill_depth_mm y flipper_length_mm.

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]].plot.box();

png

Crear un plot kde de la columna ‘flipper_length_mm’

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df["flipper_length_mm"].plot.kde(
    title="Distribución de la longitud de la aleta"
);

png

Identifique como cambiar el color de la linea, incrementar su ancho y como lograr que sea discontinua

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df["flipper_length_mm"].plot.kde(
    lw=5, ls="--", color="b", title="Distribución de la longitud de la aleta"
);

png

Crear un area plot con las columnas ‘bill_length_mm’,‘bill_depth_mm’ y ‘flipper_length_mm’ con un alpha de 0.4

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]].plot.area(
    alpha=0.4
);

png


Graficas con Plotly

Con plotly se pueden crear graficas interactivas que permiten explorar los datos de forma mas detallada.

Los Datos

Trabajaremos con el famoso conjunto de datos del titanic ara hacer visualizaciones con seaborn

import pandas as pd
import plotly.express as px
titanic = pd.read_csv("https://github.com/mwaskom/seaborn-data/raw/master/titanic.csv")
titanic.head()

survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue

Recrear las siguientes graficas utilizando el dataframe de datos del titanic. Hay muy pocas pistas, ya que la mayoría de las graficas se pueden hacer con solo una o dos líneas de código y una pista básicamente daría la solución. Preste especial atención a las etiquetas de x y y para obtener sugerencias.

El fin principal es utilizar las visualizaciones para contestar preguntas y representar los datos

¡Nota! Para no perder la imagen de la respuesta, asegúrese de no escribir el código en la celda que está directamente arriba de la grafica

¿Existira alguna relacion entre la edad y el valor pagado por el tiquete?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.scatter(titanic, x="fare", y="age", marginal_x="histogram", marginal_y="histogram")

¿Como fue la distribuccion del precio pagado por los tiquetes?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, x="fare")

¿Como es la distribuccion de Cuartiles (Boxplot) de las edades de los pasajeros por Clase en que viaja?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.box(titanic, y="age", x="class", color="class")

¿Como es la distribuccion (violin) de las edades de los pasajeros por Clase en que viaja?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.violin(titanic, y="age", x="class", color="class")

¿Como es la distribuccion de Genero en los pasajeros?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, "sex", color="sex")

¿Como son las correlaciones entre las variables (Heatmap)?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
tic_corr = titanic.corr(numeric_only=True)
px.imshow(tic_corr, text_auto=True)

¿Como es la distribuccion de la Edad por Genero?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, "age", facet_col="sex", color="sex")

¿Como es la distribuccion de la Edad por Genero y clase en la que viajan?

# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, "age", facet_col="sex", facet_row="class", color="sex")

Phd. Jose R. Zapata

Anterior