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.

Mostrar mapa de calor con una matriz de matrices – problema con la imagen final / trama

Me gustaría trazar un mapa de calor de imshow, pero la imagen final se ve muy pequeña y desproporcionada. Mis datos representan una distancia medida entre átomos (aproximadamente 10 átomos de una molécula a aproximadamente 30 átomos de otra molécula) y el resultado es una matriz de matrices. Preparé una salida similar para la ilustración, pero mi conjunto de datos original es más grande:


import numpy as np
array1 = np.random.randint(20, size=30)
array2 = np.random.randint(20, size=30)
array3 = np.random.randint(20, size=30)
array4 = np.random.randint(20, size=30)
array5 = np.random.randint(20, size=30)
array6 = np.random.randint(20, size=30)
array7 = np.random.randint(20, size=30)
array8 = np.random.randint(20, size=30)
array9 = np.random.randint(20, size=30)
arrayOfArrays = np.array([array1, array2, array3, array4, array5, array6, array7, array8, array9])

Luego quise hacer un mapa de calor para ver las distancias entre los átomos, por lo que este es mi código:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
im = ax.imshow(arrayOfArrays, origin='upper')

Esto está aquí porque uso este enfoque para definir xticks e yticks en mi trama original. Aquí modifiqué el código con “len(range(0,30))”, pero en mi trama original hay una cantidad de átomos para los que medí las distancias (algo como n_atoms=len(dataset1)).

n1=len(range(0,30))
n2=len(range(0,9))
tick_interval = 1
ax.set_yticks(np.arange(n2)[::tick_interval])
ax.set_xticks(np.arange(n1)[::tick_interval])

Barra de color

cbar = fig.colorbar(im)

La imagen final creada con este gráfico en particular ya se ve pequeña, pero la imagen con mis datos originales es aún más pequeña y no puedo ver los colores en absoluto.

Agradecería mucho cualquier sugerencia sobre cuál es el problema o qué parte del código debería editarse. Intenté editar el tamaño de la imagen, agregar “interpolación”, “aspecto” …

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para aumentar el tamaño de su mapa de calor imshow es ajustar el tamaño de la figura usando el parámetro figsize en la función plt.subplots(). Por ejemplo, puedes probar el siguiente código:

    fig, ax = plt.subplots(figsize=(10, 5))
    im = ax.imshow(arrayOfArrays, origin='upper', cmap='hot')
    # Resto del código permanece igual
    

    En este ejemplo, el parámetro figsize establece el ancho y alto de la figura en pulgadas (10 pulgadas por 5 pulgadas en este caso).

    Además, puedes experimentar con diferentes mapas de color y ajustar las propiedades de la barra de color para mejorar la visualización.

    fig, ax = plt.subplots(figsize=(10, 5))
    im = ax.imshow(arrayOfArrays, origin='upper', cmap='viridis')
    ax.set_title('Distancia entre átomos')
    
    # Ajustar las propiedades de la barra de color
    cbar = fig.colorbar(im, ax=ax, pad=0.02)
    cbar.ax.set_ylabel('Distancia (Å)', rotation=270, va='bottom')
    
    # Establecer los ticks de x e y
    n_1, n_2 = arrayOfArrays.shape
    intervalo_de_tics = 3
    ax.set_yticks(np.arange(n_2)[::intervalo_de_tics])
    ax.set_xticks(np.arange(n_1)[::intervalo_de_tics])
    ax.set_yticklabels(np.arange(1, n_2+1)[::intervalo_de_tics])
    ax.set_xticklabels(np.arange(1, n_1+1)[::intervalo_de_tics])
    
    # Establecer las etiquetas de los ejes y la posición de los ticks
    ax.set_xlabel('Índice de átomos')
    ax.set_ylabel('Molécula')
    ax.xaxis.set_label_coords(0.5, -0.15)
    ax.yaxis.set_label_coords(-0.15, 0.5)
    
    plt.show()
    

    Aquí, he utilizado el mapa de color viridis y ajusté la rotación y posición de la etiqueta de la barra de color usando la función cbar.ax.set_ylabel() con los argumentos rotation=270 para rotar la etiqueta verticalmente y va= 'bottom' para mover la etiqueta hacia abajo. También he establecido las etiquetas de los ejes x e y y ajusté su posición usando las funciones ax.xaxis.set_label_coords() y ax.yaxis.set_label_coords().

Comments are closed.