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?


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)

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)

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)

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


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

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

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.


-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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.