matplotlib / seaborn: แถวแรกและแถวสุดท้ายตัดครึ่งหนึ่งของแผนภาพความร้อน


108

เมื่อวางแผนผังความร้อนกับนกทะเล (และเมทริกซ์สหสัมพันธ์กับ matplotlib) แถวแรกและแถวสุดท้ายจะถูกตัดครึ่งหนึ่ง สิ่งนี้เกิดขึ้นเมื่อฉันเรียกใช้ตัวอย่างโค้ดขั้นต่ำที่พบทางออนไลน์

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

และได้รับผลลัพธ์นี้ (ฉันยังไม่ได้รับอนุญาตให้ฝังรูปภาพ) ป้ายกำกับที่แกน y อยู่ในจุดที่ถูกต้อง แต่แถวนั้นไม่สมบูรณ์

ไม่กี่วันที่ผ่านมาได้ผลตามที่ตั้งใจไว้ ตั้งแต่นั้นมาฉันติดตั้ง texlive-xetex ดังนั้นฉันจึงลบมันอีกครั้ง แต่ก็ไม่สามารถแก้ปัญหาได้

มีความคิดอะไรที่ฉันอาจขาดหายไป?


1
คุณสามารถให้ข้อมูลจริงได้หรือไม่? ดูเหมือนจะเล็กพอ
Mad Physicist

1
โดยทั่วไปขอบเขตพิกเซลของเราคือ -0.5 ถึงขนาด + 0.5 ดูเหมือนว่าจะตั้งค่าขีด จำกัด แกนนอนอย่างถูกต้อง แต่ไม่ใช่แนวตั้ง คุณยุ่งกับ ylim ทุกที่หรือไม่?
Mad Physicist

คำตอบ:


98

แต่น่าเสียดายที่Matplotlib 3.1.1 heatmaps ทะเลยากจน ; และโดยทั่วไปแกนกลับด้านที่มีเห็บคงที่
สิ่งนี้ได้รับการแก้ไขแล้วในเวอร์ชันการพัฒนาปัจจุบัน คุณอาจจะด้วยเหตุนี้

  • เปลี่ยนกลับเป็น matplotlib 3.1.0
  • ใช้ matplotlib 3.1.2 หรือสูงกว่า
  • ตั้งค่าขีด จำกัด แผนที่ความร้อนด้วยตนเอง ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)

ฉันเคยเห็นคำถามนี้มาแล้ว แต่ฉันไม่คุ้นเคยวิธีเปลี่ยนกลับไปเป็น matplotlib 3.1.0 หรือตั้งค่าขีด จำกัด แผนที่ความร้อนด้วยตนเอง (ลองแล้ว แต่ยังคงถูกตัดทอน) และไม่สามารถรอ 3.1.2 ได้ ฉันจะเปลี่ยนกลับเป็น matplotlib 3.1.0 ได้อย่างไร
SozDaneron

ขึ้นอยู่กับว่าคุณติดตั้ง matplotlib อย่างไร เช่นผ่าน pip เห็นนี้
ImportanceOfBeingErnest

ใช่ฉันยังใหม่กับ PyCharm คิดออกแล้วขอบคุณ
SozDaneron

1
@ talha06 ไม่ฉันหมายถึงขีด จำกัด ของพล็อต ถ้าax = sns.heatmap(...)ตั้งค่าax.set_ylim(...)เป็นอะไรก็ได้ที่คุณต้องการให้เป็นขีด จำกัด
ImportanceOfBeingErnest

2
สำหรับ 7 ax.set_ylim(0 ,7)ระดับผมใช้ ใช้เพียงแค่ ax.set_ylim (7) ทำให้เหลือหนึ่งแถวลงครึ่งหนึ่ง
Dzamo Norton

83

มันเป็นจุดบกพร่องในการถดถอย matplotlib ระหว่าง 3.1.0 และ 3.1.1 คุณสามารถแก้ไขได้โดย:

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)

ตัวอย่างเช่นสิ่งนี้ไม่ได้ผลกับฉัน แต่เพื่อความเป็นธรรมปัญหาของฉันแตกต่างกันตรงที่ทั้งแถวของแผนที่ความร้อนหายไป สำหรับฉันการย้อนกลับเวอร์ชันดังที่ฉันได้กล่าวไว้ในความคิดเห็นด้านบนเป็นวิธีเดียวที่จะออก
Sidak

มันใช้งานได้แม้ว่ามันจะดูไร้เหตุผล ทำไมต้องbottomมีขนาดใหญ่กว่าtop?
Eric Duminil

ทำงานให้ฉัน 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

แก้ไขโดยใช้ข้างต้นและตั้งค่าขีด จำกัด แผนที่ความร้อนด้วยตนเอง

อันดับแรก

ax = sns.heatmap(...

ตรวจสอบแกนปัจจุบันด้วย

ax.get_ylim()
(5.5, 0.5)

แก้ไขด้วย

ax.set_ylim(6.0, 0)

5

ฉันแก้ไขได้โดยเพิ่มบรรทัดนี้ในรหัสของฉันด้วยmatplotlib==3.1.1:

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

NB. เหตุผลเดียวที่ใช้งานได้เนื่องจากแกน x ไม่มีการเปลี่ยนแปลงดังนั้นโปรดใช้ความเสี่ยงของคุณเองกับเวอร์ชัน mpl ในอนาคต


3

matplotlib 3.1.2 หมด - มีให้บริการใน Anaconda cloud ผ่าน conda-forge แต่ฉันไม่สามารถติดตั้งผ่าน conda install ทางเลือกด้วยตนเองใช้งานได้: ดาวน์โหลด matplotlib 3.1.2 จาก github และติดตั้งผ่าน 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

ฉันไม่สามารถอัปเดตแพ็กเกจได้ ฉันได้รับข้อผิดพลาดนี้: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

ข้างต้นได้ลองใช้ใน MacOS ไม่คุ้นเคยกับสถานการณ์ของ Windows แต่ดูเหมือนว่าจะเป็นปัญหาการอนุญาตภายในเครื่อง
rustyDev

ขอบคุณสำหรับการตอบรับ ฉันลงเอยด้วยการติดตั้งเวอร์ชันเก่ากว่า (matplotlib-3.1.0)
Jade Cacho


0

rustyDev ถูกต้องเกี่ยวกับ conda-forge แต่ฉันไม่จำเป็นต้องทำการติดตั้ง pip ด้วยตนเองจากการดาวน์โหลด github สำหรับฉันบน Windows มันทำงานได้โดยตรง และพล็อตทุกอย่างดีอีกครั้ง

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

conda install -c conda-forge matplotlib

คะแนนเสริมไม่จำเป็นสำหรับคำตอบ:

หลังจากนั้นฉันลองทำตามขั้นตอนอื่น ๆ แต่ไม่จำเป็น: ใน conda prompt: conda search matplotlib --info ไม่แสดงข้อมูลเวอร์ชันใหม่ข้อมูลล่าสุดคือสำหรับ 3.1.1 ดังนั้นฉันจึงลองใช้pip install matplotlib==3.1.2pip แต่ pip บอกว่า "ตอบสนองความต้องการแล้ว"

จากนั้นรับเวอร์ชันตามmedium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__แสดงว่าติดตั้ง 3.1.2 เรียบร้อยแล้ว

Btw ฉันมีข้อผิดพลาดนี้โดยตรงหลังจากอัปเดต Spyder เป็น v4.0.0 ข้อผิดพลาดอยู่ในโครงร่างของเมทริกซ์ความสับสน สิ่งนี้ได้กล่าวไว้แล้วเมื่อหลายเดือนก่อน stackoverflow.com/questions/57225685/…ซึ่งเชื่อมโยงกับคำถามนกทะเลนี้แล้ว



-1

ฉันแก้ไขปัญหานี้ด้วยรหัสต่อไปนี้:

ป้อนคำอธิบายภาพที่นี่


2
คำตอบนี้จะมีประโยชน์มากขึ้นหากรหัสจริงเป็นข้อความมากกว่าในรูปภาพ
DavidW
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.