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.

Cómo trazar una leyenda imshow basada en un mapa de colores

Estoy tratando de graficar una leyenda basada en el mapa de colores de mi gráfico “imshow”.

Podría hacerlo especificando los colores y etiquetas que quiero utilizando “matplotlib.mpatches” y “matplotlib.colors”, como vi en algunos ejemplos, pero solo me gustaría seguir los colores de un cmap. Por ejemplo:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Datos
df = pd.DataFrame({"a":[0.1, 0.3, 0.4, 0.2, 0.5, 0.6],
                   "z":[5, 10, 15, 20, 25, 30],
                   "class":[1, 2, 3, 1, 3, 3]})

# Clúster 2D de 'Clase'
cluster = np.repeat(np.expand_dims(df["class"].values, 1), 10, 1)

f, ax = plt.subplots(nrows=1, ncols=2, figsize=(12,10))
ax[0].plot(df["a"], df["z"])
ax[1].imshow(cluster, interpolation='none', cmap="Paired",
             aspect='auto', vmin=1, vmax=3, extent=[0, 1, df["z"].min(), df["z"].max()])

ax[0].set_ylim(df["z"].min(), df["z"].max())

ax[1].legend()

Aquí me gustaría graficar la leyenda basada en el cmap “Paired” de mi gráfico “imshow”, pero con este código solo obtengo “No se encontraron elementos con etiquetas para colocar en la leyenda”. ¿Alguien podría ayudarme?

Necesito algo como esto:

Imagen

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar una leyenda basada en la escala de colores de un gráfico imshow, puedes usar la clase matplotlib.colorbar.ColorbarBase. Aquí tienes un ejemplo:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    
    # Datos
    df = pd.DataFrame({"a":[0.1, 0.3, 0.4, 0.2, 0.5, 0.6],
                       "z":[5, 10, 15, 20, 25, 30],
                       "class":[1, 2, 3, 1, 3, 3]})
    
    # Clúster 2D de 'clase'
    cluster = np.repeat(np.expand_dims(df["class"].values, 1), 10, 1)
    
    # Mapa de colores
    cmap = ListedColormap(["tab:blue", "tab:orange", "tab:green"])
    
    f, ax = plt.subplots(nrows=1, ncols=2, figsize=(12,10))
    ax[0].plot(df["a"], df["z"])
    im = ax[1].imshow(cluster, interpolation='none', cmap=cmap,
                 aspect='auto', vmin=1, vmax=3, extent=[0, 1, df["z"].min(), df["z"].max()])
    
    # Barra de colores y leyenda
    cbar = plt.colorbar(im, ax=ax[1])
    cbar.set_ticks([1.5, 2.5, 3.5])
    cbar.set_ticklabels(["Clase 1", "Clase 2", "Clase 3"])
    cbar.ax.tick_params(labelsize=14)
    
    ax[1].set_xlabel("a", fontsize=14)
    ax[1].set_ylabel("z", fontsize=14)
    ax[0].set_ylim(df["z"].min(), df["z"].max())
    
    plt.show()
    

    En este ejemplo, creamos un mapa de colores con tres colores (azul, naranja y verde) y lo pasamos como argumento a imshow. Luego, creamos una barra de colores basada en este mapa de colores utilizando la clase ColorbarBase, establecemos las marcas y etiquetas, y ajustamos el tamaño de fuente. Por último, agregamos el xlabel y ylabel al segundo subplot y establecemos el ylim para el primer subplot.

    La salida debería lucir así:

    imshow legend example

Comments are closed.