matplotlib / seaborn: prima e ultima riga tagliate a metà del grafico della mappa termica


107

Quando si tracciano mappe di calore con seaborn (e matrici di correlazione con matplotlib) la prima e l'ultima riga vengono dimezzate. Ciò accade anche quando eseguo questo esempio di codice minimo che ho trovato online.

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()

E ottieni questo risultato (non sono ancora autorizzato a incorporare immagini) Le etichette sull'asse y sono nel punto corretto, ma le righe non sono completamente lì.

Pochi giorni fa, funziona come previsto. Da allora ho installato texlive-xetex, quindi l'ho rimosso di nuovo ma non ha risolto il mio problema.

Qualche idea su cosa potrei perdere?


1
Potete fornire i dati effettivi? Sembra abbastanza piccolo
Mad Physicist

1
In genere, i nostri limiti di pixel vanno da -0,5 a + 0,5. Sembra che i limiti dell'asse orizzontale siano impostati correttamente, ma non quello verticale. Stai scherzando con Ylim da qualche parte?
Mad Physicist

Risposte:


94

Sfortunatamente matplotlib 3.1.1 ha rotto le mappe di calore di Seaborn ; e in generale assi invertiti con tacche fisse.
Questo problema è stato risolto nell'attuale versione di sviluppo; puoi quindi

  • ripristinare matplotlib 3.1.0
  • utilizzare matplotlib 3.1.2 o versioni successive
  • imposta manualmente i limiti della mappa di calore ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)

Ho visto questa domanda in giro ma non ho familiarità con come tornare a matplotlib 3.1.0 o impostare manualmente i limiti della mappa di calore (provato ma ancora troncato) e non vedo l'ora per 3.1.2. Come posso tornare a matplotlib 3.1.0?
SozDaneron

Dipende da come hai installato matplotlib. Ad esempio tramite pip vedere questo .
ImportanceOfBeingErnest

Bene, sono ancora nuovo su PyCharm. Ora ho capito, grazie.
SozDaneron

1
@ talha06 No, intendo i limiti della trama. Se ax = sns.heatmap(...), imposta ax.set_ylim(...)quello che ti serve per i tuoi limiti.
ImportanceOfBeingErnest

2
Per 7 livelli ho dovuto usare ax.set_ylim(0 ,7). Usare solo ax.set_ylim (7) ha lasciato una riga dimezzata.
Dzamo Norton

81

È un bug nella regressione matplotlib tra 3.1.0 e 3.1.1 Puoi correggere questo problema:

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)

Questo, per esempio, non mi ha funzionato. Ma per essere onesti, il mio problema era diverso in quanto mancava un'intera riga della mappa di calore. Per me ripristinare la versione, come ho detto in un commento sopra, è stata l'unica via d'uscita.
Sidak

Funziona, anche se sembra illogico. Perché dovrebbe bottomessere più grande di top?
Eric Duminil

Ha funzionato per me. 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 ('Prediction') plt.ylabel ('Truth') plt.title ('Confusion Matrix')
MPJ567

18

Risolto il problema con l'utilizzo di quanto sopra e l'impostazione manuale dei limiti della mappa termica.

Primo

ax = sns.heatmap(...

controllato gli assi correnti con

ax.get_ylim()
(5.5, 0.5)

Risolto con

ax.set_ylim(6.0, 0)

4

L'ho risolto aggiungendo questa riga nel mio codice, con matplotlib==3.1.1:

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

NB. L'unico motivo per cui funziona è perché l'asse x non è cambiato, quindi usalo a tuo rischio con le future versioni di mpl


3

matplotlib 3.1.2 è disponibile - È disponibile nel cloud Anaconda tramite conda-forge ma non sono stato in grado di installarlo tramite conda install. L'alternativa manuale ha funzionato: Scarica matplotlib 3.1.2 da GitHub e installa tramite 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

Non riesco ad aggiornare il pacchetto. Ho ricevuto questo errore: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

Quanto sopra è stato provato in MacOS. Non ha familiarità con lo scenario di Windows ma sembra che sia un problema di autorizzazione locale.
rustyDev

Grazie per la risposta. Ho finito per installare la versione precedente (matplotlib-3.1.0).
Jade Cacho


0

rustyDev ha ragione su conda-forge, ma non avevo bisogno di eseguire un'installazione pip manuale da un download di github. Per me, su Windows, ha funzionato direttamente. E le trame sono di nuovo tutte belle.

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

conda install -c conda-forge matplotlib

punti opzionali, non necessari per la risposta:

Successivamente, ho provato altri passaggi, ma non sono necessari: Nel prompt di conda: conda search matplotlib --info non ha mostrato informazioni sulla nuova versione, le informazioni più recenti erano per 3.1.1. Così ho provato a usare pippip install matplotlib==3.1.2 ma pip dice "Requisito già soddisfatto"

Quindi ottenere la versione secondo medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__ mostra che la 3.1.2 è stata installata con successo

A proposito, ho riscontrato questo errore direttamente dopo l'aggiornamento di Spyder alla v4.0.0. L'errore era in una trama di una matrice di confusione. Questo è stato menzionato già alcuni mesi fa. stackoverflow.com/questions/57225685/… che è già collegato a questa domanda Seaborn.


-1

conda install matplotlib = 3.1.0

Questo ha funzionato per me e ho effettuato il downgrade di matplotlib da 3.1.1 a 3.1.0 e le mappe di calore hanno iniziato a comportarsi correttamente


-2

Ho risolto questo problema con il seguente codice:

inserisci qui la descrizione dell'immagine


1
Questa risposta sarebbe molto più utile se il codice effettivo fosse nel testo piuttosto che in un'immagine.
DavidW
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.