matplotlib / seaborn: baris pertama dan terakhir dipotong setengah dari plot peta panas

108

Saat memplot peta panas dengan dasar laut (dan matriks korelasi dengan matplotlib), baris pertama dan terakhir dipotong menjadi dua. Ini terjadi juga ketika saya menjalankan contoh kode minimal yang saya temukan online ini.

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

Dan dapatkan hasil ini (Saya belum diizinkan untuk menyematkan gambar) Label pada sumbu y berada di tempat yang benar, tetapi barisnya tidak sepenuhnya ada.

Beberapa hari yang lalu, ini berfungsi sebagaimana mestinya. Sejak itu, saya menginstal texlive-xetex jadi saya menghapusnya lagi tetapi itu tidak menyelesaikan masalah saya.

Ada ide apa yang bisa saya lewatkan?

Jepit
sumber
1
Bisakah Anda memberikan data sebenarnya? Tampaknya cukup kecil
Fisikawan Gila
1
Umumnya, batas piksel kami adalah -0,5 hingga ukuran + 0,5. Sepertinya batas sumbu horizontal disetel dengan benar, tetapi tidak vertikal. Apakah Anda bermain-main dengan ylim di mana saja?
Fisikawan Gila

Jawaban:

95

Sayangnya matplotlib 3.1.1 memecahkan peta panas dasar laut ; dan secara umum sumbu terbalik dengan kutu tetap.
Ini diperbaiki dalam versi pengembangan saat ini; Anda mungkin karenanya

  • kembali ke matplotlib 3.1.0
  • gunakan matplotlib 3.1.2 atau lebih tinggi
  • setel batas peta panas secara manual ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)
ImportanceOfBeingErnest
sumber
Saya telah melihat pertanyaan ini, tetapi saya tidak terbiasa bagaimana cara kembali ke matplotlib 3.1.0 atau mengatur batas peta panas secara manual (mencoba ini tetapi masih terpotong) dan tidak sabar menunggu 3.1.2. Bagaimana saya bisa kembali ke matplotlib 3.1.0?
SozDaneron
Itu tergantung pada bagaimana Anda menginstal matplotlib. Misal via pip lihat ini .
ImportanceOfBeingErnest
Benar, saya masih baru di PyCharm. Sudah tahu sekarang, terima kasih.
SozDaneron
1
@ talha06 Tidak, maksud saya batas plot. Jika ax = sns.heatmap(...), atur ax.set_ylim(...)ke apa pun yang Anda inginkan, batasan Anda.
ImportanceOfBeingErnest
2
Untuk 7 level saya harus menggunakan ax.set_ylim(0 ,7). Hanya menggunakan ax.set_ylim (7) meninggalkan satu baris dibelah dua.
Dzamo Norton
81

Ini adalah bug di regresi matplotlib antara 3.1.0 dan 3.1.1 Anda dapat memperbaikinya dengan:

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)
Nikhil Pakki
sumber
Ini, misalnya, tidak berhasil bagi saya. Namun agar adil, masalah saya berbeda karena seluruh baris peta panas hilang. Bagi saya mengembalikan versi, seperti yang saya sebutkan dalam komentar di atas, adalah satu-satunya jalan keluar.
Sidak
Itu berhasil, meskipun tampaknya tidak masuk akal. Mengapa harus bottomlebih besar dari top?
Eric Duminil
Bekerja untuk saya. 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

Memperbaiki penggunaan di atas dan menyetel batas peta panas secara manual.

Pertama

ax = sns.heatmap(...

memeriksa sumbu saat ini dengan

ax.get_ylim()
(5.5, 0.5)

Diperbaiki dengan

ax.set_ylim(6.0, 0)
lbarbus.dll
sumber
4

Saya menyelesaikannya dengan menambahkan baris ini di kode saya, dengan matplotlib==3.1.1:

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

NB. Satu-satunya alasan ini berhasil adalah karena sumbu x tidak berubah, jadi gunakan risiko Anda sendiri dengan versi MPL mendatang

Magnus Berg Sletfjerding
sumber
3

matplotlib 3.1.2 keluar - Ini tersedia di cloud Anaconda melalui conda-forge tetapi saya tidak dapat menginstalnya melalui conda install. Alternatif manual berfungsi: Unduh matplotlib 3.1.2 dari github dan instal melalui 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
rustyDev
sumber
Saya tidak dapat memperbarui paket. Saya menerima kesalahan ini: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
Di atas telah dicoba di MacOS. Tidak terbiasa dengan skenario Windows tetapi tampaknya ini adalah masalah izin lokal.
rustyDev
Terima kasih atas tanggapannya. Saya akhirnya menginstal versi yang lebih lama (matplotlib-3.1.0).
Jade Cacho
0

Itu terjadi dengan matplotlib versi 3.1.1 seperti yang disarankan oleh pentingnya beingernest

Mengikuti memecahkan masalah saya

pip install matplotlib==3.1.0

purushotam radadia
sumber
0

rustyDev benar tentang conda-forge, tetapi saya tidak perlu melakukan penginstalan pip manual dari unduhan github. Bagi saya, di Windows, ini bekerja secara langsung. Dan plotnya bagus lagi.

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

conda install -c conda-forge matplotlib

poin opsional, tidak diperlukan untuk jawaban:

Setelah itu, saya mencoba langkah lain, tetapi tidak diperlukan: Dalam prompt conda: pencarian conda matplotlib --info tidak menunjukkan info versi baru, info terbaru adalah untuk 3.1.1. Jadi saya mencoba menggunakan pippip install matplotlib==3.1.2 Tapi pip mengatakan "Persyaratan sudah dipenuhi"

Kemudian dapatkan versinya sesuai dengan medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__ menunjukkan bahwa 3.1.2 berhasil diinstal

Btw, saya mengalami kesalahan ini langsung setelah memperbarui Spyder ke v4.0.0. Kesalahannya ada di plot matriks kebingungan. Ini sudah disebutkan beberapa bulan lalu. stackoverflow.com/questions/57225685/… yang sudah ditautkan ke pertanyaan dasar laut ini.

Lorenz
sumber
-1

conda install matplotlib = 3.1.0

Ini berfungsi untuk saya dan menurunkan matplotlib dari 3.1.1 ke 3.1.0 dan peta panas mulai berfungsi dengan benar

Sujit Bhattacharyya
sumber
-2

Saya memecahkan masalah ini dengan kode berikut:

masukkan deskripsi gambar di sini

Juan Andres Nappa Severino
sumber
1
Jawaban ini akan jauh lebih berguna jika kode sebenarnya ada dalam teks daripada dalam gambar.
DavidW