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.

El mapa de calor sobre saltado no se muestra correctamente.

Tengo un mapa de calor trazado sobre una imagen (como se muestra en el enlace de la imagen 1), con un filtro gaussiano y datos normalizados. El principal problema es que no hay ningún valor por debajo de 92 en el eje y, por lo que el gráfico no comienza en (0,0), sino en (0,92). Entonces, cuando combino ambas imágenes (mapa de calor e imagen de fondo), hay un corte abrupto en el gráfico (como se muestra en el segundo enlace, donde está el mapa de calor sin fondo).

Entonces, ¿cómo puedo extender el eje en el mapa de calor para que comience en (0,0)?

A continuación se muestra el código que estoy utilizando actualmente para trazar ambas imágenes. ¡Gracias!

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from scipy.ndimage.filters import gaussian_filter
import matplotlib.colors as mcolors
from sklearn.preprocessing import normalize

x = df['x_data']
y = df['y_data']

heatmap, xedges, yedges = np.histogram2d(x, y, bins=[800, 600])

extent = [0, xedges[-1], yedges[0], yedges[-1]]
heatmap = normalize(heatmap)
heatmap = gaussian_filter(heatmap, 16)

colors = [(1, 1 - c, 0, c) for c in np.linspace(0, 1, 100)]
cmapred = mcolors.LinearSegmentedColormap.from_list('mycmap', colors, N=5)

map_img = mpimg.imread('dir/to/background/image.png')

fig, ax = plt.subplots(figsize=(16.1, 9.1))

plt.imshow(map_img, extent=[0, 800, 0, 600], cmap='Greys_r')
plt.imshow(heatmap.T, extent=extent, origin='lower', cmap=cmapred, alpha=0.7)

plt.ylim([0, 600])
plt.xlim([0, 800])
plt.show()

Enlace de la imagen del mapa de calor + fondo: https://imgur.com/2vX6Bw6

Enlace de la imagen solo del mapa de calor: https://imgur.com/axMe7K7

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para extender el eje y del mapa de calor para que comience en (0,0), puedes añadir el parámetro “vmin” a la función “imshow()” con un valor de 0. Esto asegura que el valor mínimo del mapa de calor siempre sea 0 y la escala de colores se ajuste en consecuencia.

    Aquí está el código modificado:

    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    from scipy.ndimage.filters import gaussian_filter
    import matplotlib.colors as mcolors
    from sklearn.preprocessing import normalize
    
    x = df['x_data']
    y = df['y_data']
    
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=[800,600])
    
    extent = [0, xedges[-1], yedges[0], yedges[-1]]
    heatmap = normalize(heatmap)
    heatmap = gaussian_filter(heatmap, 16)
    
    colors = [(1, 1-c, 0, c) for c in np.linspace(0, 1, 100)]
    cmapred = mcolors.LinearSegmentedColormap.from_list('mycmap', colors, N=5)
    
    map_img = mpimg.imread('ruta/hacia/imagen/de/fondo.png')
    
    fig, ax = plt.subplots(figsize=(16.1, 9.1))
    
    plt.imshow(map_img, extent=[0, 800, 0, 600], cmap='Greys_r')
    plt.imshow(heatmap.T, extent=extent, origin='lower', cmap=cmapred, alpha=0.7, vmin=0)
    
    plt.ylim([0,600])
    plt.xlim([0,800])
    plt.show()
    

    Añadiendo “vmin=0” a la función “plt.imshow()”, el mapa de calor ahora comenzará en (0,0) y se mezclará suavemente con la imagen de fondo.

Comments are closed.