matplotlib / seaborn: pierwszy i ostatni rząd przecięty na pół działki mapy cieplnej


108

Podczas kreślenia map ciepła z porostem morskim (i macierzami korelacji z matplotlib) pierwszy i ostatni wiersz przecina się na pół. Dzieje się tak również, gdy uruchamiam ten minimalny przykład kodu, który znalazłem w Internecie.

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

I uzyskaj ten wynik (nie mogę jeszcze osadzać obrazów) Etykiety na osi y znajdują się we właściwym miejscu, ale rzędy nie są tam całkowicie.

Kilka dni temu działało zgodnie z przeznaczeniem. Od tego czasu zainstalowałem texlive-xetex, więc ponownie go usunąłem, ale nie rozwiązało to mojego problemu.

Jakieś pomysły, czego mógłbym brakować?


1
Czy możesz podać rzeczywiste dane? Wydaje się wystarczająco mały
Mad Physicist

1
Ogólnie nasze granice pikseli wynoszą od -0,5 do rozmiaru + 0,5. Wygląda na to, że granice osi poziomej są ustawione poprawnie, ale nie pionowa. Bawisz się gdzieś z ylim?
Mad Physicist

Odpowiedzi:


98

Niestety matplotlib 3.1.1 zepsuł mapy cieplne dotyczące dna morskiego ; i ogólnie odwrócone osie ze stałymi znacznikami.
Zostało to naprawione w bieżącej wersji rozwojowej; możesz stąd

  • powróć do matplotlib 3.1.0
  • użyj matplotlib 3.1.2 lub nowszej
  • ustaw ręcznie limity mapy cieplnej ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)

Widziałem to pytanie, ale nie wiem, jak powrócić do matplotlib 3.1.0 lub ustawić limity mapy cieplnej ręcznie (próbowałem tego, ale nadal obcięto) i nie mogę się doczekać 3.1.2. Jak mogę wrócić do Matplotlib 3.1.0?
SozDaneron

To zależy od tego, jak zainstalowałeś matplotlib. Np. Przez pip zobacz to .
ImportanceOfBeingErnest

Racja, wciąż jestem nowy w PyCharm. Zrozumiałem to teraz, dzięki.
SozDaneron

1
@ talha06 Nie, mam na myśli granice działki. Jeśli ax = sns.heatmap(...), ustaw tak, ax.set_ylim(...)jak chcesz.
ImportanceOfBeingErnest

2
Na 7 poziomów musiałem użyć ax.set_ylim(0 ,7). Używając tylko ax.set_ylim (7), jeden wiersz został zmniejszony o połowę.
Dzamo Norton

83

Jest to błąd w regresji matplotlib między 3.1.0 a 3.1.1 Możesz to naprawić przez:

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)

Na przykład mi to nie pomogło. Ale żeby być uczciwym, mój problem był inny, ponieważ brakowało całego wiersza mapy cieplnej. Dla mnie przywrócenie wersji, jak wspomniałem w komentarzu powyżej, było jedynym wyjściem.
Sidak

Działa, chociaż wydaje się nielogiczne. Dlaczego powinien bottombyć większy niż top?
Eric Duminil

Pracował dla mnie. 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

Naprawiono korzystanie z powyższego i ręczne ustawianie limitów mapy cieplnej.

Pierwszy

ax = sns.heatmap(...

sprawdził aktualne osie za pomocą

ax.get_ylim()
(5.5, 0.5)

Naprawiono za pomocą

ax.set_ylim(6.0, 0)

5

Rozwiązałem to, dodając tę ​​linię w moim kodzie, z matplotlib==3.1.1:

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

NB. Jedynym powodem, dla którego to działa, jest to, że oś X nie jest zmieniona, więc używaj na własne ryzyko z przyszłymi wersjami mpl


3

Matplotlib 3.1.2 jest niedostępny - jest dostępny w chmurze Anaconda przez conda-forge, ale nie udało mi się go zainstalować przez conda install. Ręczna alternatywa zadziałała: Pobierz matplotlib 3.1.2 z github i zainstaluj przez 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

Nie mogę zaktualizować pakietu. Otrzymałem ten błąd: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

Powyższe zostało wypróbowane w systemie MacOS. Nie znam scenariusza Windows, ale wydaje się, że jest to problem z lokalnymi uprawnieniami.
rustyDev

Dziękuję za odpowiedź. Skończyło się na zainstalowaniu starszej wersji (matplotlib-3.1.0).
Jade Cacho


0

rustyDev ma rację co do Conda-Forge, ale nie musiałem wykonywać ręcznej instalacji pip z Githuba. U mnie w systemie Windows działało bezpośrednio. I znowu wszystko jest ładne.

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

conda install -c conda-forge matplotlib

punkty opcjonalne, niepotrzebne do odpowiedzi:

Potem wypróbowałem inne kroki, ale nie są one potrzebne: W zachęcie conda: wyszukiwanie conda matplotlib --info nie pokazało żadnych informacji o nowej wersji, najnowsze informacje dotyczyły wersji 3.1.1. Dlatego próbowałem użyć pip, pip install matplotlib==3.1.2ale pip mówi: „Wymaganie już spełnione”

Uzyskanie wersji zgodnej z medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__pokazuje, że 3.1.2 został pomyślnie zainstalowany

Przy okazji, miałem ten błąd bezpośrednio po aktualizacji Spydera do wersji 4.0.0. Błąd tkwił w wykresie macierzy pomyłki. Wspomniano o tym już kilka miesięcy temu. stackoverflow.com/questions/57225685/…, który jest już powiązany z tym pytaniem dotyczącym gatunku morskiego.


-1

conda install matplotlib = 3.1.0

To zadziałało dla mnie i obniżyłem matplotlib z 3.1.1 do 3.1.0, a mapy popularności zaczęły zachowywać się poprawnie


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.