matplotlib / seaborn: перший і останній ряд розрізаний на половині сюжетної карти


108

При побудові теплових карт з новонародженими (і співвідношення матриць з матплотлібом) перший і останній ряд розрізають навпіл. Це трапляється і тоді, коли я запускаю цей мінімальний приклад коду, який я знайшов в Інтернеті.

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

І отримайте цей результат (мені ще не дозволено вставляти зображення) Мітки на осі у знаходяться на правильному місці, але рядки там не повністю.

Кілька днів тому це працює за призначенням. З того часу я встановив texlive-xetex, тому я його знову видалив, але це не вирішило моєї проблеми.

Будь-які ідеї, чого я міг би бракувати?


1
Чи можете ви надати фактичні дані? Здається, це досить мало
Божевільний фізик

1
Як правило, наші межі пікселів - від 0,5 до розміру + 0,5. Схоже, межі горизонтальної осі встановлені правильно, але не вертикально. Ви нікуди не водитеся з ylim?
Божевільний фізик

Відповіді:


95

На жаль, matplotlib 3.1.1 порушив теплові карти моряків ; і взагалі перевернуті осі з нерухомими кліщами.
Це зафіксовано в поточній версії розробки; ви можете звідси

  • повернутися до 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 дивіться це .
ВажливістьOfBeingErnest

Правильно, я все ще новачок у PyCharm. Зрозумів це зараз, спасибі.
SozDaneron

1
@ talha06 Ні, я маю на увазі межі сюжету. Якщо ax = sns.heatmap(...), встановіть ax.set_ylim(...)все, що вам потрібно, щоб ваші межі були.
ВажливістьOfBeingErnest

2
Для 7 рівнів мені довелося користуватися ax.set_ylim(0 ,7). За допомогою лише ax.set_ylim (7) залишився один ряд вдвічі.
Дзамо Нортон

81

Помилка в регресії 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?
Ерік Думініл

Працювали для мене. plt.figure (figsize = (5,3)) ax = sn.heatmap (cm, annot = True, fmt = '') знизу, зверху = ax.get_ylim () ax.set_ylim (знизу + 0,5, верх - 0,5) plt.xlabel ("Прогноз") plt.ylabel ("Істина") plt.title ("Матриця плутанини")
MPJ567

18

Виправлено за допомогою наведених вище та встановлення меж теплової карти вручну.

Перший

ax = sns.heatmap(...

перевірили поточні осі с

ax.get_ylim()
(5.5, 0.5)

Виправлено за допомогою

ax.set_ylim(6.0, 0)

4

Я вирішив це, додавши цей рядок у свій код із matplotlib==3.1.1:

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

NB. Єдина причина цього працює в тому, що вісь x не змінюється, тому використовуйте на свій страх і ризик майбутні версії mpl


3

matplotlib 3.1.2 вимкнений - Він доступний у хмарі Anaconda через conda-forge, але я не зміг встановити його через install conda. Ручна альтернатива спрацювала: Завантажте 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).
Джейд Качо


0

rustyDev має рацію щодо conda-forge, але мені не потрібно було робити ручну установку піп-файлів із завантаження github. Для мене в Windows це працювало безпосередньо. І сюжети знову всі приємні.

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

conda install -c conda-forge matplotlib

необов'язкові бали, не потрібні для відповіді:

Згодом я спробував інші кроки, але вони не потрібні: У підказці conda: conda search matplotlib --info не було відомостей про нову версію, остання інформація була для 3.1.1. Таким чином я спробував використовувати pippip install matplotlib==3.1.2 But, але pip каже: "Вимога вже задоволена"

Потім отримання версії відповідно до medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__ показує, що 3.1.2 було успішно встановлено

До речі, у мене виникла помилка безпосередньо після оновлення Spyder до v4.0.0. Помилка була в графіку матриці плутанини. Про це йшлося вже кілька місяців тому. stackoverflow.com/questions/57225685/…, що вже пов'язане з цим питанням про народження.


-1

conda встановити matplotlib = 3.1.0

Це працювало для мене і знижувало матплотліб з 3.1.1 до 3.1.0, і теплові карти почали поводитися правильно


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.