matplotlib / seaborn: erste und letzte Reihe in zwei Hälften des Heatmap-Diagramms schneiden


105

Beim Zeichnen von Heatmaps mit Seaborn (und Korrelationsmatrizen mit Matplotlib) werden die erste und die letzte Reihe halbiert. Dies passiert auch, wenn ich dieses minimale Codebeispiel ausführe, das ich online gefunden habe.

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

Und erhalte dieses Ergebnis (ich darf noch keine Bilder einbetten) Die Beschriftungen auf der y-Achse befinden sich an der richtigen Stelle, aber die Zeilen sind nicht vollständig vorhanden.

Vor ein paar Tagen hat es wie vorgesehen funktioniert. Seitdem habe ich texlive-xetex installiert, also habe ich es wieder entfernt, aber es hat mein Problem nicht gelöst.

Irgendwelche Ideen, was mir fehlen könnte?


1
Können Sie die tatsächlichen Daten angeben? Es scheint klein genug
Mad Physicist

1
Im Allgemeinen sind unsere Pixelgrenzen -0,5 bis Größe + 0,5. Es sieht so aus, als ob die horizontalen Achsengrenzen korrekt eingestellt sind, nicht jedoch die vertikale. Spielst du irgendwo mit ylim?
Mad Physicist

Antworten:


94

Leider hat matplotlib 3.1.1 seegeborene Heatmaps gebrochen ; und im Allgemeinen umgekehrte Achsen mit festen Zecken.
Dies ist in der aktuellen Entwicklungsversion behoben. Sie können daher

  • auf matplotlib 3.1.0 zurückgreifen
  • Verwenden Sie Matplotlib 3.1.2 oder höher
  • Stellen Sie die Heatmap-Grenzwerte manuell ein ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)

Ich habe diese Frage gesehen, bin aber nicht vertraut, wie ich zu Matplotlib 3.1.0 zurückkehren oder die Heatmap-Grenzwerte manuell festlegen kann (habe dies versucht, aber immer noch abgeschnitten) und kann nicht auf 3.1.2 warten. Wie kann ich zu Matplotlib 3.1.0 zurückkehren?
SozDaneron

Dies hängt davon ab, wie Sie matplotlib installiert haben. ZB via Pip sehen Sie das .
ImportanceOfBeingErnest

Richtig, ich bin noch neu bei PyCharm. Ich habe es jetzt herausgefunden, danke.
SozDaneron

1
@ talha06 Nein, ich meine die Handlungsgrenzen. Wenn ja, stellen Sie ax = sns.heatmap(...)ein ax.set_ylim(...), worauf Sie Ihre Grenzen setzen müssen.
ImportanceOfBeingErnest

2
Für 7 Level musste ich verwenden ax.set_ylim(0 ,7). Mit nur ax.set_ylim (7) wurde eine Zeile halbiert.
Dzamo Norton

80

Es ist ein Fehler in der Matplotlib-Regression zwischen 3.1.0 und 3.1.1. Sie können dies korrigieren, indem Sie:

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)

Das hat mir zum Beispiel nicht geklappt. Aber um fair zu sein, mein Problem war insofern anders, als eine ganze Reihe der Heatmap fehlte. Für mich war das Zurücksetzen der Version, wie ich oben in einem Kommentar erwähnt habe, der einzige Ausweg.
Sidak

Es funktioniert, obwohl es unlogisch erscheint. Warum sollte bottomgrößer sein als top?
Eric Duminil

Hat für mich gearbeitet. plt.figure (figsize = (5,3)) ax = sn.heatmap (cm, annot = True, fmt = '') unten, oben = ax.get_ylim () ax.set_ylim (unten + 0,5, oben - 0,5) plt.xlabel ('Vorhersage') plt.ylabel ('Wahrheit') plt.title ('Verwirrungsmatrix')
MPJ567

17

Mit dem oben genannten Problem behoben und die Heatmap-Grenzwerte manuell festgelegt.

Zuerst

ax = sns.heatmap(...

überprüfte die aktuellen Achsen mit

ax.get_ylim()
(5.5, 0.5)

Behoben mit

ax.set_ylim(6.0, 0)

4

Ich habe es gelöst, indem ich diese Zeile in meinen Code eingefügt habe, mit matplotlib==3.1.1:

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

NB. Der einzige Grund, warum dies funktioniert, ist, dass die x-Achse nicht geändert wird. Verwenden Sie sie daher auf eigenes Risiko für zukünftige MPL-Versionen


3

matplotlib 3.1.2 ist out - Es ist in der Anaconda-Cloud über conda-forge verfügbar, aber ich konnte es nicht über conda install installieren. Die manuelle Alternative hat funktioniert: Laden Sie matplotlib 3.1.2 von github herunter und installieren Sie es über 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

Ich kann das Paket nicht aktualisieren. Ich habe diesen Fehler erhalten: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

Das obige wurde in MacOS versucht. Das Windows-Szenario ist nicht bekannt, es scheint jedoch ein lokales Berechtigungsproblem zu sein.
rustyDev

Danke für die Antwort. Am Ende habe ich die ältere Version (matplotlib-3.1.0) installiert.
Jade Cacho

0

Dies geschieht mit matplotlib Version 3.1.1, wie es durch die Wichtigkeit von beestest vorgeschlagen wird

Das Folgende hat mein Problem gelöst

pip install matplotlib==3.1.0


0

rustyDev hat Recht mit conda-forge, aber ich musste keine manuelle Pip-Installation von einem Github-Download durchführen. Unter Windows hat es direkt funktioniert. Und die Handlungen sind alle wieder schön.

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

conda install -c conda-forge matplotlib

optionale Punkte, die für die Antwort nicht benötigt werden:

Danach habe ich andere Schritte ausprobiert, die jedoch nicht benötigt werden: In conda prompt: conda search matplotlib --info zeigte keine neuen Versionsinformationen an, die neuesten Informationen waren für 3.1.1. Also habe ich versucht, pip mitpip install matplotlib==3.1.2 Aber pip sagt "Anforderung bereits erfüllt"

Das Abrufen der Version gemäß medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__zeigt dann, dass 3.1.2 erfolgreich installiert wurde

Übrigens hatte ich diesen Fehler direkt nach dem Update von Spyder auf v4.0.0. Der Fehler lag in einer Darstellung einer Verwirrungsmatrix. Dies wurde bereits vor einigen Monaten erwähnt. stackoverflow.com/questions/57225685/…, das bereits mit dieser seegeborenen Frage verknüpft ist.


-1

conda install matplotlib = 3.1.0

Dies funktionierte für mich und stufte matplotlib von 3.1.1 auf 3.1.0 herab, und die Heatmaps begannen sich korrekt zu verhalten


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.