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.