es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Gráfico de dispersión Seaborn/matplotlib, agregar barras de error de un color específico.

¿Cómo puedo agregar barras de error a una gráfica de dispersión y controlar el color de la barra de error?

Por ejemplo, tengo este dataframe:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sns

df = pd.DataFrame(
    {
        "id": [1, 2, 3, 4],
        "x_mid": [0.5, 0.6, 0.2, 0.1],
        "x_low": [0.41, 0.55, 0.18, 0.02],
        "x_high": [0.66, 0.62, 0.3, 0.4],
        "x_col": ["black", "black", "red", "black"],
        "y_mid": [0.4, 0.45, 0.33, 0.12],
        "y_low": [0.35, 0.42, 0.3, 0.1],
        "y_high": [0.5, 0.5, 0.38, 0.22],
        "y_col": ["red", "black", "red", "black"],
    }
)

display(df)

Y aquí está la gráfica de dispersión. Aquí estoy usando Seaborn, pero también consideraré respuestas usando Matplotlib directamente.

fig, ax = plt.subplots(figsize=(4, 4))

g=sns.scatterplot(
    ax=ax,
    data=df,
    x="x_mid",
    y="y_mid",
)

ax.plot([0, 0.8], [0, 0.8], color="black", linewidth=1)
ax.set(xlim=(0, 0.8), ylim=(0, 0.8))
ax.grid(b=True, which="major")
ax.xaxis.set_major_locator(ticker.MultipleLocator(0.2))
ax.yaxis.set_major_locator(ticker.MultipleLocator(0.2))

Los campos “x_col” y “y_col” son el color para la barra de error. Por lo tanto, para la primera entrada de la fila, el rango x es (0.41, 0.66) y quiero que sea una barra de error negra; y el rango y es (0.35, 0.5), y quiero que sea una barra de error roja, como se muestra a continuación.

¿Cómo puedo agregar barras de error basadas en el rango x_ y y_ en el dataframe, y controlar el color de las barras de error?

Usando Python 3.8.3, Matplotlib 3.2.1, Seaborn 0.11.1.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar barras de error a un gráfico de dispersión, podemos utilizar la función errorbar en matplotlib. Podemos extraer los puntos medios de x e y, junto con los límites inferior y superior correspondientes, y el color de las barras de error del dataframe. Luego, podemos iterar a través de cada fila del dataframe y trazar las barras de error horizontales y verticales.

    Aquí hay un código de ejemplo que agrega barras de error al gráfico de dispersión en cuestión:

    import numpy as np
    
    # Extraer datos del dataframe
    x_mid = df["x_mid"]
    x_low = df["x_low"]
    x_high = df["x_high"]
    x_col = df["x_col"]
    y_mid = df["y_mid"]
    y_low = df["y_low"]
    y_high = df["y_high"]
    y_col = df["y_col"]
    
    # Crear gráfico de dispersión
    fig, ax = plt.subplots(figsize=(4, 4))
    g = sns.scatterplot(
        ax=ax,
        data=df,
        x="x_mid",
        y="y_mid",
    )
    
    # Trazar barras de error
    for i in range(len(df)):
        # Barra de error vertical
        ax.errorbar(
            x_mid[i], y_mid[i], yerr=np.array([[y_low[i]], [y_high[i]]]),
            fmt='none', color=y_col[i], capsize=5, capthick=1, linewidth=1,
        )
        # Barra de error horizontal
        ax.errorbar(
            x_mid[i], y_mid[i], xerr=np.array([[x_low[i]], [x_high[i]]]).T,
            fmt='none', color=x_col[i], capsize=5, capthick=1, linewidth=1,
        )
    
    # Establecer límites del gráfico y las marcas de los ejes
    ax.plot([0, 0.8], [0, 0.8], color="black", linewidth=1)
    ax.set(xlim=(0, 0.8), ylim=(0, 0.8))
    ax.grid(b=True, which="major")
    ax.xaxis.set_major_locator(ticker.MultipleLocator(0.2))
    ax.yaxis.set_major_locator(ticker.MultipleLocator(0.2))
    

    En este código, utilizamos dos llamadas errorbar para trazar las barras de error vertical y horizontal por separado. Para cada barra de error, proporcionamos el punto medio (x_mid[i], y_mid[i]), los límites inferior y superior (x_low[i], x_high[i], y_low[i], y_high[i]), y el color (x_col[i], y_col[i]). También establecemos el tamaño de la línea del fin de la barra (capsize), el grosor de la línea del fin de la barra (capthick), y el grosor de la línea (linewidth) para hacerlas más visibles.

    El resultado del gráfico debería tener barras de error que coincidan con los colores especificados en el dataframe.

Comments are closed.