matplotlib / seaborn: hàng đầu tiên và hàng cuối cùng được cắt thành một nửa của biểu đồ nhiệt bản đồ


107

Khi vẽ bản đồ nhiệt với seaborn (và ma trận tương quan với matplotlib), hàng đầu tiên và hàng cuối cùng bị giảm đi một nửa. Điều này cũng xảy ra khi tôi chạy ví dụ mã tối thiểu này mà tôi tìm thấy trực tuyến.

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

Và nhận được kết quả này (mình chưa được phép nhúng ảnh) Các nhãn ở trục y nằm đúng vị trí, nhưng các hàng không hoàn toàn ở đó.

Một vài ngày trước, nó hoạt động như dự định. Kể từ đó, tôi đã cài đặt texlive-xetex vì vậy tôi đã gỡ bỏ nó một lần nữa nhưng nó không giải quyết được vấn đề của tôi.

Bất kỳ ý tưởng những gì tôi có thể bị thiếu?


1
Bạn có thể cung cấp dữ liệu thực tế không? Nó có vẻ đủ nhỏ
Mad Physicist

1
Nói chung, giới hạn pixel của chúng tôi là -0,5 đến kích thước + 0,5. Có vẻ như giới hạn trục ngang được đặt chính xác, nhưng không phải theo chiều dọc. Bạn có đang gây rối với ylim ở đâu không?
Mad Physicist

Câu trả lời:


94

Thật không may matplotlib 3.1.1 đã phá vỡ bản đồ nhiệt của sinh vật biển ; và nói chung các trục đảo ngược với các tích tắc cố định.
Điều này đã được khắc phục trong phiên bản phát triển hiện tại; do đó bạn có thể

  • hoàn nguyên về matplotlib 3.1.0
  • sử dụng matplotlib 3.1.2 trở lên
  • đặt giới hạn bản đồ nhiệt theo cách thủ công ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)

Tôi đã thấy câu hỏi này xung quanh nhưng không quen làm thế nào để hoàn nguyên về matplotlib 3.1.0 hoặc đặt giới hạn bản đồ nhiệt theo cách thủ công (đã thử điều này nhưng vẫn bị cắt bớt) và không thể đợi 3.1.2. Làm cách nào để hoàn nguyên về matplotlib 3.1.0?
SozDaneron

Nó phụ thuộc vào cách bạn cài đặt matplotlib. Ví dụ: qua pip xem này .
Tầm quan

Đúng vậy, tôi vẫn chưa quen với PyCharm. Tìm ra nó ngay bây giờ, cảm ơn.
SozDaneron

1
@ talha06 Không, ý tôi là giới hạn cốt truyện. Nếu ax = sns.heatmap(...), hãy đặt ax.set_ylim(...)thành bất cứ điều gì bạn cần giới hạn của mình.
Tầm quan

2
Đối với 7 cấp độ tôi đã phải sử dụng ax.set_ylim(0 ,7). Chỉ sử dụng ax.set_ylim (7) còn lại một hàng giảm một nửa.
Dzamo Norton

81

Đó là một lỗi trong hồi quy matplotlib giữa 3.1.0 và 3.1.1. Bạn có thể sửa lỗi này bằng cách:

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)

Điều này, chẳng hạn, không làm việc với tôi. Nhưng công bằng mà nói, vấn đề của tôi khác ở chỗ thiếu toàn bộ hàng của bản đồ nhiệt. Đối với tôi, hoàn nguyên phiên bản, như tôi đã đề cập trong một bình luận ở trên, là cách duy nhất.
Sidak

Nó hoạt động, mặc dù nó có vẻ phi logic. Tại sao phải bottomlớn hơn top?
Eric Duminil

Đã làm cho tôi. 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 ('Dự đoán') plt.ylabel ('Sự thật') plt.title ('Ma trận nhầm lẫn')
MPJ567

18

Đã sửa lỗi bằng cách sử dụng ở trên và đặt giới hạn bản đồ nhiệt theo cách thủ công.

Đầu tiên

ax = sns.heatmap(...

đã kiểm tra các trục hiện tại với

ax.get_ylim()
(5.5, 0.5)

Đã sửa với

ax.set_ylim(6.0, 0)

4

Tôi đã giải quyết nó bằng cách thêm dòng này vào mã của mình, với matplotlib==3.1.1:

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

NB. Lý do duy nhất khiến điều này hoạt động là do trục x không được thay đổi, vì vậy hãy tự chịu rủi ro khi sử dụng với các phiên bản mpl trong tương lai


3

matplotlib 3.1.2 đã ra mắt - Nó có sẵn trong đám mây Anaconda thông qua conda-forge nhưng tôi không thể cài đặt nó qua conda install. Giải pháp thay thế thủ công đã hoạt động: Tải xuống matplotlib 3.1.2 từ github và cài đặt qua 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

Tôi không thể cập nhật gói. Tôi nhận được lỗi này: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

Ở trên đã được thử trong MacOS. Không quen thuộc với kịch bản Windows nhưng có vẻ như đó là một vấn đề về quyền cục bộ.
gỉDev

Cảm ơn bạn đã phản hồi. Tôi đã kết thúc cài đặt phiên bản cũ hơn (matplotlib-3.1.0).
Jade Cacho


0

gỉyDev nói đúng về conda-forge, nhưng tôi không cần thực hiện cài đặt pip thủ công từ bản tải xuống github. Đối với tôi, trên Windows, nó hoạt động trực tiếp. Và các lô đều đẹp trở lại.

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

conda install -c conda-forge matplotlib

điểm tùy chọn, không cần thiết cho câu trả lời:

Sau đó, tôi đã thử các bước khác nhưng không cần thiết: Trong lời nhắc conda: conda search matplotlib --info không hiển thị thông tin phiên bản mới, thông tin gần đây nhất là cho 3.1.1. Vì vậy, tôi đã thử sử dụng pip pip install matplotlib==3.1.2nhưng pip nói rằng "Yêu cầu đã được thỏa mãn"

Sau đó, nhận được phiên bản theo medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__cho thấy rằng 3.1.2 đã được cài đặt thành công

Btw, tôi đã gặp lỗi này trực tiếp sau khi cập nhật Spyder lên v4.0.0. Lỗi là trong một âm mưu của một ma trận nhầm lẫn. Điều này đã được đề cập cách đây vài tháng. stackoverflow.com/questions/57225685/… đã được liên kết với câu hỏi sơ sinh này.


-1

conda cài đặt matplotlib = 3.1.0

Điều này phù hợp với tôi và đã hạ cấp matplotlib từ 3.1.1 xuống 3.1.0 và các bản đồ nhiệt bắt đầu hoạt động chính xác


-2

Tôi đã giải quyết vấn đề này với mã sau:

nhập mô tả hình ảnh ở đây


1
Câu trả lời này sẽ hữu ích hơn rất nhiều nếu mã thực sự ở dạng văn bản thay vì ở dạng hình ảnh.
DavidW
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.