matplotlib / seaborn: primera y última fila cortadas a la mitad del diagrama de mapa de calor


107

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 sucede también 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 puedo 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, funcionó según lo previsto. Desde entonces, instalé texlive-xetex, así que lo eliminé de nuevo, pero no resolvió mi problema.

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


1
¿Puede proporcionar los datos reales? Parece lo suficientemente pequeño
Mad Physicist

1
Generalmente, nuestros límites de píxeles son de -0,5 a un tamaño de + 0,5. Parece que los límites del eje horizontal están configurados correctamente, pero no el vertical. ¿Te estás metiendo con ylim en alguna parte?
Mad Physicist

Respuestas:


94

Desafortunadamente, matplotlib 3.1.1 rompió los mapas de calor de seaborn ; y en general ejes invertidos con ticks fijos.
Esto está arreglado en la versión de desarrollo actual; puedes 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 (probé esto pero aún truncado) y no puedo esperar a 3.1.2. ¿Cómo podría volver a matplotlib 3.1.0?
SozDaneron

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

Bien, todavía soy nuevo en PyCharm. Lo he descubierto ahora, gracias.
SozDaneron

1
@ talha06 No, me refiero a los límites de la trama. Si ax = sns.heatmap(...), establezca ax.set_ylim(...)lo que necesite que sean sus límites.
ImportanceOfBeingErnest

2
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

81

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 porque faltaba una fila completa del mapa de calor. Para mí, revertir la versión, como mencioné en un comentario anterior, fue la única salida.
Sidak

Funciona, aunque parezca ilógico. ¿Por qué debería bottomser más grande que top?
Eric Duminil

Trabajó para mi. plt.figure (figsize = (5,3)) ax = sn.heatmap (cm, annot = True, fmt = '') abajo, arriba = ax.get_ylim () ax.set_ylim (abajo + 0.5, arriba - 0.5) plt.xlabel ('Predicción') plt.ylabel ('Verdad') plt.title ('Matriz de confusión')
MPJ567

18

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

primero

ax = sns.heatmap(...

comprobado los ejes actuales con

ax.get_ylim()
(5.5, 0.5)

Fijo con

ax.set_ylim(6.0, 0)

4

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 úselo bajo su propio riesgo con futuras versiones de mpl.


3

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 desde 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

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

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


0

rustyDev tiene razón sobre conda-forge, pero no necesitaba hacer una instalación manual de pip desde una descarga de github. Para mí, en Windows, funcionó directamente. Y las parcelas vuelven a ser bonitas.

https://anaconda.org/conda-forge/matplotlib

conda install -c conda-forge matplotlib

puntos opcionales, no necesarios para la respuesta:

Luego, probé otros pasos, pero no son necesarios: En el indicador de conda: conda search matplotlib --info no mostró información de nueva versión, la información más reciente fue para 3.1.1. Por lo tanto, probé pip usando pip install matplotlib==3.1.2Pero pip dice "Requisito ya satisfecho"

Luego, obtener la versión de acuerdo con medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__muestra que 3.1.2 se instaló correctamente

Por cierto, tuve este error directamente después de actualizar Spyder a v4.0.0. El error estaba en un diagrama de una matriz de confusión. Esto ya se mencionó hace algunos meses. stackoverflow.com/questions/57225685/… que ya está vinculado a esta pregunta nacida del mar.


-1

conda install matplotlib = 3.1.0

Esto funcionó para mí y degradó matplotlib de 3.1.1 a 3.1.0 y los mapas de calor comenzaron a comportarse correctamente


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.