HOWTO · Seaborn
Cómo crear un diagrama de caja con Seaborn en Python
Este tutorial demuestra cómo crear diagramas de caja usando el módulo seaborn en python
En esta página
Usa seaborn.boxplot() para resumir una distribución numérica o comparar valores entre categorías. Asigna explícitamente las columnas de datos para indicar a Seaborn qué variable corresponde a cada eje. Un diagrama de caja muestra la mediana y el rango intercuartílico (IQR); con la regla predeterminada para los bigotes, estos llegan hasta las observaciones más extremas que están a menos de 1,5 IQR de la caja, y las observaciones más alejadas aparecen como puntos individuales.
Crear un diagrama de caja para una distribución
Coloca las mediciones en una columna de un DataFrame y asigna esa columna a y. Así queda claro el papel de los datos y el gráfico obtiene una etiqueta de eje útil. El siguiente ejemplo usa valores fijos, por lo que la entrada es la misma cada vez que lo ejecutas.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score")
ax.set_title("Score distribution")
plt.show()
La línea dentro de la caja marca la mediana. La caja abarca desde el primer hasta el tercer cuartil, por lo que su altura representa la mitad central de las observaciones. Una caja más larga indica una mayor dispersión en esa parte central de los datos. Los bigotes muestran el rango definido por la regla seleccionada; no necesariamente llegan hasta los valores mínimo y máximo.
Comparar distribuciones entre categorías
Asigna una categoría a x y la medición numérica a y para mostrar una caja independiente por categoría. En este conjunto de datos, cada caja resume Price para un nivel de Quantity. Al añadir hue="Product", cada categoría se divide en grupos de productos, lo que facilita compararlos para una misma cantidad.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
}
)
ax = sns.boxplot(data=data, x="Quantity", y="Price", hue="Product")
ax.set_title("Price by quantity and product")
plt.show()
Usa hue cuando la agrupación adicional ayude a responder una pregunta comparativa. Si hay muchos grupos, las cajas pueden quedar demasiado juntas; simplifica las categorías o crea gráficos separados para que las distribuciones sigan siendo legibles.
Mostrar observaciones individuales con un gráfico de puntos
Un diagrama de caja condensa los datos en estadísticas resumidas. Superpón seaborn.stripplot() cuando también sea necesario mostrar cada observación. Reutiliza los mismos ejes y asignaciones para ambas capas, y añade un poco de dispersión horizontal para evitar que los puntos con valores similares se superpongan por completo.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score", color="lightgray")
sns.stripplot(data=data, y="Score", color="darkred", jitter=0.15, ax=ax)
ax.set_title("Scores with individual observations")
plt.show()
La caja sigue mostrando el resumen, mientras que cada marcador representa una fila de los datos. En un conjunto de datos más grande, los puntos pueden superponerse; ajusta el tamaño de los marcadores o su transparencia para que las zonas más densas sigan siendo legibles.
Personalizar el diagrama de caja
Usa los métodos de Matplotlib para limitar los ejes y centrar la vista en un rango de valores relevante, linewidth para cambiar el grosor de los bordes de las cajas y los bigotes, y palette para asignar colores a las categorías. El parámetro orient controla la orientación; por ejemplo, orient="h" solicita un gráfico horizontal cuando las asignaciones son compatibles. Los límites de los ejes solo cambian la vista mostrada: elígelos con cuidado y mantén clara la escala para no ocultar observaciones relevantes.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
}
)
ax = sns.boxplot(
data=data,
x="Quantity",
y="Price",
hue="Product",
linewidth=2.5,
palette="Set2",
)
ax.set_ylim(8, 20)
ax.set_title("Customized price comparison")
plt.show()
Los colores de la paleta corresponden a los grupos de hue. Para usar cajas horizontales, intercambia las asignaciones de categoría y medición y establece orient="h"; en ese caso, aplica los límites del eje con set_xlim() en lugar de set_ylim().
Crear un diagrama de caja con catplot()
Usa catplot() con kind="box" para trabajar con la interfaz de nivel de figura. Acepta las mismas asignaciones explícitas de datos y puede crear paneles separados con col o row cuando quieras dividir la comparación según otra variable. Para un solo gráfico, seaborn.boxplot() es la opción de nivel de ejes; catplot() resulta práctico cuando la figura necesita facetas.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
}
)
grid = sns.catplot(data=data, x="Quantity", y="Price", kind="box")
grid.set_axis_labels("Quantity", "Price")
grid.fig.suptitle("Price by quantity")
plt.show()