Primera y última fila cortadas por la mitad de la trama del mapa de calor

5 minutos de lectura

Avatar de usuario de Flops
fracasos

Al trazar mapas de calor con seaborn (y matrices de correlación con matplotlib), la primera y la última fila se cortan por la mitad. Esto también sucede cuando ejecuto este ejemplo de código mínimo que encontré en línea.

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

data = pd.read_csv('https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv')
plt.figure(figsize=(10,5))
sns.heatmap(data.corr())
plt.show()

Y obtén este resultado (todavía no tengo permitido incrustar imágenes)
Las etiquetas en el eje y están en el lugar correcto, pero las filas no están completamente allí.

Hace unos días, funciona según lo previsto. Desde entonces, instalé texlive-xetex, así que lo eliminé nuevamente, pero no resolvió mi problema.

¿Alguna idea de lo que me podría estar perdiendo?

Avatar de usuario de ImportanceOfBeingErnest
La Importancia De SerErnest

Desafortunadamente matplotlib 3.1.1 rompieron los mapas de calor nacidos en el mar; y en general ejes invertidos con ticks fijos.
Esto está solucionado en la versión de desarrollo actual; usted puede por lo tanto

  • volver a matplotlib 3.1.0
  • use matplotlib 3.1.2 o superior
  • establecer los límites del mapa de calor manualmente (ax.set_ylim(bottom, top) # set the ylim to bottom, top)

  • He visto esta pregunta, pero no estoy familiarizado con cómo volver a matplotlib 3.1.0 o establecer los límites del mapa de calor manualmente (lo intenté pero aún está truncado) y no puedo esperar a 3.1.2. ¿Cómo podría volver a matplotlib 3.1.0?

    – Soz Daneron

    6 de agosto de 2019 a las 15:17

  • Depende de cómo haya instalado matplotlib. Por ejemplo, a través de pip ver esto.

    – La Importancia De Ser Ernesto

    6 de agosto de 2019 a las 15:20

  • Correcto, todavía soy nuevo en PyCharm. Lo descubrí ahora, gracias.

    – Soz Daneron

    6 de agosto de 2019 a las 15:24

  • @ talha06 No, me refiero a los límites de la trama. Si ax = sns.heatmap(...)colocar ax.set_ylim(...) a lo que necesites que sean tus límites.

    – La Importancia De Ser Ernesto

    15 de agosto de 2019 a las 2:09

  • Para 7 niveles tuve que usar ax.set_ylim(0 ,7). Usando solo ax.set_ylim(7) dejó una fila a la mitad.

    –Dzamo Norton

    16 de octubre de 2019 a las 3:29

Avatar de usuario de Nikhil Pakki
Nikhil Pakki

Es un error en la regresión de matplotlib entre 3.1.0 y 3.1.1. Puede corregir esto de la siguiente manera:

import seaborn as sns
df_corr = someDataFrame.corr()
ax = sns.heatmap(df_corr, annot=True) #notation: "annot" not "annote"
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)

  • Esto, por ejemplo, no me funcionó. Pero para ser justos, mi problema era diferente en el sentido de que faltaba una fila completa del mapa de calor. Para mí, revertir la versión, como mencioné en un comentario anterior, era la única salida.

    – Sidak

    4 de noviembre de 2019 a las 14:36

  • Funciona, aunque parezca ilógico. Porque deberia bottom ser más grande que top?

    –Eric Duminil

    19 de enero de 2020 a las 14:18

  • Trabajó para mi. plt.figure(figsize=(5,3)) ax = sn.heatmap(cm, annot=True, fmt=”) bottom, top = ax.get_ylim() ax.set_ylim(bottom + 0.5, top – 0.5) plt.xlabel(‘Predicción’) plt.ylabel(‘Verdad’) plt.title(‘Matriz de confusión’)

    – MPJ567

    7 febrero 2020 a las 20:32

avatar de usuario de lbarbus
lbarbus

Se corrigió usando lo anterior y configurando los límites del mapa de calor manualmente.

Primero

ax = sns.heatmap(...

comprobó los ejes actuales con

ax.get_ylim()
(5.5, 0.5)

arreglado con

ax.set_ylim(6.0, 0)

Lo resolví agregando esta línea en mi código, con matplotlib==3.1.1:

ax.set_ylim(sorted(ax.get_xlim(), reverse=True))

NÓTESE BIEN. La única razón por la que esto funciona es porque el eje x no cambia, así que utilícelo bajo su propio riesgo con futuras versiones de mpl

matplotlib 3.1.2 está disponible: está disponible en la nube de Anaconda a través de conda-forge, pero no pude instalarlo a través de conda install. La alternativa manual funcionó: descargue matplotlib 3.1.2 de github e instálelo a través de pip

 % curl https://codeload.github.com/matplotlib/matplotlib/tar.gz/v3.1.2 --output matplotlib-3.1.2.tar.gz
 % pip install matplotlib-3.1.2.tar.gz

  • No puedo actualizar el paquete. Recibí este error: ERROR: Could not install packages due to an EnvironmentError: [WinError 5] Access is denied: 'c:\\users\\w-book\\anaconda3\\lib\\site-packages\\matplotlib\\backends\\_backend_agg.cp37-win_amd64.pyd' Consider using the --user option or check the permissions.

    – Jade Cacho

    17 de diciembre de 2019 a las 8:21


  • Lo anterior se probó en MacOS. No estoy familiarizado con el escenario de Windows, pero parece que es un problema de permisos locales.

    – rustyDev

    18 de diciembre de 2019 a las 15:21

  • Gracias por la respuesta. Terminé instalando la versión anterior (matplotlib-3.1.0).

    – Jade Cacho

    19 de diciembre de 2019 a las 4:25


Avatar de usuario de Super Mario
Super Mario

Trabajó para mi:

b, t = plt.ylim()
b += 0.5
t -= 0.5
custom_ylim = (b, t)
plt.setp(axes, ylim=custom_ylim)

  • No puedo actualizar el paquete. Recibí este error: ERROR: Could not install packages due to an EnvironmentError: [WinError 5] Access is denied: 'c:\\users\\w-book\\anaconda3\\lib\\site-packages\\matplotlib\\backends\\_backend_agg.cp37-win_amd64.pyd' Consider using the --user option or check the permissions.

    – Jade Cacho

    17 de diciembre de 2019 a las 8:21


  • Lo anterior se probó en MacOS. No estoy familiarizado con el escenario de Windows, pero parece que es un problema de permisos locales.

    – rustyDev

    18 de diciembre de 2019 a las 15:21

  • Gracias por la respuesta. Terminé instalando la versión anterior (matplotlib-3.1.0).

    – Jade Cacho

    19 de diciembre de 2019 a las 4:25


Avatar de usuario de AAKANKSHA DUGGAL
AAKANKSHA DUGGAL

Rebaja tu matplotlib

!pip install matplotlib==3.1.0

y agregue esta línea a su código de trama:

ax[i].set_ylim(sorted(ax[i].get_xlim(), reverse=True))
 

¿Ha sido útil esta solución?