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?

Fracasos
fuente
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)
Importancia de ser ernesto
fuente
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)
Nikhil Pakki
fuente
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)
lbarbus
fuente
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.

Magnus Berg Sletfjerding
fuente
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
rustyDev
fuente
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

Sucede con la versión 3.1.1 de matplotlib como sugiere la importancia de beingernest

Seguir resolvió mi problema

pip install matplotlib==3.1.0

purushotam radadia
fuente
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.

Lorenz
fuente
-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

Sujit Bhattacharyya
fuente
-2

Resolví este problema con el siguiente código:

ingrese la descripción de la imagen aquí

Juan Andrés Nappa Severino
fuente
1
Esta respuesta sería mucho más útil si el código real estuviera en texto en lugar de en una imagen.
DavidW