matplotlib / seaborn: première et dernière ligne coupées en deux du tracé de la carte thermique


108

Lorsque vous tracez des cartes thermiques avec seaborn (et des matrices de corrélation avec matplotlib), la première et la dernière ligne sont coupées en deux. Cela se produit également lorsque j'exécute cet exemple de code minimal que j'ai trouvé en ligne.

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

Et obtenez ce résultat (je ne suis pas encore autorisé à intégrer des images) Les étiquettes sur l'axe y sont au bon endroit, mais les lignes n'y sont pas complètement.

Il y a quelques jours, cela fonctionnait comme prévu. Depuis, j'ai installé texlive-xetex donc je l'ai à nouveau supprimé mais cela n'a pas résolu mon problème.

Des idées de ce que je pourrais manquer?


1
Pouvez-vous fournir les données réelles? Il semble assez petit
Mad Physicist

1
En général, nos limites de pixels vont de -0,5 à la taille + 0,5. On dirait que les limites de l'axe horizontal sont définies correctement, mais pas la verticale. Jouez-vous avec ylim n'importe où?
Mad Physicist

Réponses:


95

Malheureusement, matplotlib 3.1.1 a cassé les cartes thermiques des marins ; et en général des axes inversés avec des graduations fixes.
Ce problème est résolu dans la version de développement actuelle; vous pouvez donc

  • revenir à matplotlib 3.1.0
  • utiliser matplotlib 3.1.2 ou supérieur
  • définir les limites de la carte thermique manuellement ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)

J'ai vu cette question mais je ne sais pas comment revenir à matplotlib 3.1.0 ou définir manuellement les limites de la carte thermique (essayé mais toujours tronqué) et je ne peux pas attendre la 3.1.2. Comment puis-je revenir à matplotlib 3.1.0?
SozDaneron

Cela dépend de la façon dont vous avez installé matplotlib. Par exemple via pip voir ceci .
ImportanceOfBeingErnest

Oui, je suis encore nouveau sur PyCharm. Je l'ai compris maintenant, merci.
SozDaneron

1
@ talha06 Non, je veux dire les limites de l'intrigue. Si ax = sns.heatmap(...), définissez ax.set_ylim(...)ce que vous voulez que vos limites soient.
ImportanceOfBeingErnest

2
Pour 7 niveaux, j'ai dû utiliser ax.set_ylim(0 ,7). En utilisant juste ax.set_ylim (7), une ligne a été réduite de moitié.
Dzamo Norton

81

C'est un bogue dans la régression matplotlib entre 3.1.0 et 3.1.1 Vous pouvez corriger cela en:

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)

Cela, par exemple, ne m'a pas fonctionné. Mais pour être honnête, mon problème était différent en ce qu'une ligne entière de la carte thermique manquait. Pour moi, revenir à la version, comme je l'ai mentionné dans un commentaire ci-dessus, était la seule issue.
Sidak

Cela fonctionne, même si cela semble illogique. Pourquoi devrait bottomêtre plus grand que top?
Eric Duminil le

A travaillé pour moi. plt.figure (figsize = (5,3)) ax = sn.heatmap (cm, annot = True, fmt = '') bas, haut = ax.get_ylim () ax.set_ylim (bas + 0,5, haut - 0,5) plt.xlabel ('Prediction') plt.ylabel ('Truth') plt.title ('Confusion Matrix')
MPJ567

18

Correction de l'utilisation de ce qui précède et de la définition manuelle des limites de la carte thermique.

Première

ax = sns.heatmap(...

vérifié les axes courants avec

ax.get_ylim()
(5.5, 0.5)

Fixé avec

ax.set_ylim(6.0, 0)

4

Je l'ai résolu en ajoutant cette ligne dans mon code, avec matplotlib==3.1.1:

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

NB. La seule raison pour laquelle cela fonctionne est que l'axe des x n'est pas modifié, alors utilisez-le à vos propres risques avec les futures versions de mpl


3

matplotlib 3.1.2 est sorti - Il est disponible dans le cloud Anaconda via conda-forge mais je n'ai pas pu l'installer via conda install. L'alternative manuelle a fonctionné: Téléchargez matplotlib 3.1.2 à partir de github et installez via 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

Je ne parviens pas à mettre à jour le package. J'ai reçu cette erreur: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

Ce qui précède a été essayé sous MacOS. Pas familier avec le scénario Windows, mais il semble que ce soit un problème d'autorisation local.
rustyDev

Merci pour votre réponse. J'ai fini par installer l'ancienne version (matplotlib-3.1.0).
Jade Cacho


0

rustyDev a raison à propos de conda-forge, mais je n'ai pas eu besoin de faire une installation manuelle de pip à partir d'un téléchargement github. Pour moi, sous Windows, cela fonctionnait directement. Et les parcelles sont toutes belles à nouveau.

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

conda install -c conda-forge matplotlib

points facultatifs, non nécessaires pour la réponse:

Ensuite, j'ai essayé d'autres étapes, mais elles ne sont pas nécessaires: Dans l'invite conda: recherche conda matplotlib --info n'a montré aucune nouvelle information de version, les informations les plus récentes étaient pour 3.1.1. J'ai donc essayé pip en utilisant pip install matplotlib==3.1.2Mais pip dit "Exigence déjà satisfaite"

Puis obtenir la version selon medium.com/@rakshithvasudev/... python - import matplotlib - matplotlib.__version__ montre que 3.1.2 a été installé avec succès

Btw, j'ai eu cette erreur directement après la mise à jour de Spyder vers la v4.0.0. L'erreur était dans un tracé d'une matrice de confusion. Cela a déjà été mentionné il y a quelques mois. stackoverflow.com/questions/57225685/… qui est déjà lié à cette question marine.


-1

conda installer matplotlib = 3.1.0

Cela a fonctionné pour moi et a rétrogradé matplotlib de 3.1.1 à 3.1.0 et les heatmaps ont commencé à se comporter correctement


-2

J'ai résolu ce problème avec le code suivant:

entrez la description de l'image ici


1
Cette réponse serait beaucoup plus utile si le code réel était dans du texte plutôt que dans une image.
DavidW
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.