web-dev-qa-db-fra.com

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

Lors du traçage 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()

And get this result (I am not allowed to embed images yet) Les étiquettes sur l'axe y sont au bon endroit, mais les lignes ne sont pas complètement là.

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

Des idées sur ce qui pourrait me manquer?

91
Flops

Malheureusement matplotlib 3.1.1 cartes thermiques brisées; et en général des axes inversés à tiques 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 manuellement les limites de la carte thermique (ax.set_ylim(...))
79

C'est un bug 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)
55
Nikhil Pakki

Corrigé en utilisant ce qui précède et en définissant les limites de la carte thermique manuellement.

Première

ax = sns.heatmap(...

vérifié les axes actuels avec

ax.get_ylim()
(5.5, 0.5)

Fixé avec

ax.set_ylim(6.0, 0)
16
lbarbus

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 depuis 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
3
rustyDev

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 risques et périls avec les futures versions de mpl

Cela se produit avec matplotlib version 3.1.1 comme suggéré par importanceofbeingernest

Après avoir résolu mon problème

pip install matplotlib==3.1.0

0
purushotam radadia

conda install matplotlib = 3.1.0

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

0
Sujit Bhattacharyya

rustyDev a raison sur conda-forge, mais je n'ai pas eu besoin de faire une installation manuelle de pip depuis un téléchargement de github. Pour moi, sur Windows, cela a fonctionné directement. Et les parcelles sont toutes de nouveau agréables.

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

conda install -c conda-forge matplotlib

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

Par la suite, j'ai essayé d'autres étapes, mais elles ne sont pas nécessaires: Dans l'invite de conda: la recherche de conda matplotlib --info n'a montré aucune nouvelle information de version, la plus récente était pour 3.1.1. J'ai donc essayé pip en utilisant pip install matplotlib==3.1.2 Mais 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 version 4.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.

0
Lorenz