matplotlib / seaborn: первая и последняя строки разрезают половину графика тепловой карты


108

При построении тепловых карт с помощью seaborn (и корреляционных матриц с помощью 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
Вы можете предоставить актуальные данные? Кажется, достаточно маленьким
Безумный физик

1
Обычно наши границы пикселей составляют от -0,5 до размера + 0,5. Похоже, пределы горизонтальной оси установлены правильно, но не вертикальная. Вы куда-нибудь возитесь с Илимом?
Mad Physicist

Ответы:


98

К сожалению, 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 06

Это зависит от того, как вы установили matplotlib. Например, через pip см. Это .
ImportanceOfBeingErnest

Хорошо, я все еще новичок в PyCharm. Теперь разобрался, спасибо.
SozDaneron 06

1
@ talha06 Нет, я имею в виду пределы сюжета. Если ax = sns.heatmap(...), установите ax.set_ylim(...)все, что вам нужно.
ImportanceOfBeingErnest

2
Для 7 уровней пришлось использовать ax.set_ylim(0 ,7). Использование только ax.set_ylim (7) оставило одну строку вдвое.
Дзамо Нортон

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?
Эрик Думинил,

Работал у меня. 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 ('Прогноз') plt.ylabel ('Истина') plt.title ('Матрица путаницы')
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 через 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: поиск conda matplotlib --info не показал никакой информации о новой версии, самая последняя информация была для 3.1.1. Таким образом, я попробовал использовать пип, pip install matplotlib==3.1.2но пип говорит: «Требование уже выполнено»

Затем получение версии согласно medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__показывает, что 3.1.2 была успешно установлена

Кстати, эта ошибка возникла сразу после обновления Spyder до версии 4.0.0. Ошибка заключалась в построении матрицы неточностей. Об этом говорилось уже несколько месяцев назад. stackoverflow.com/questions/57225685/…, который уже связан с этим морским вопросом.


-1

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

Это сработало для меня и понизило версию matplotlib с 3.1.1 до 3.1.0, и тепловые карты начали вести себя правильно.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.