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에서 size + 0.5입니다. 가로 축 제한이 올바르게 설정되었지만 세로가 아닌 것 같습니다. 당신은 어디에서 ylim을 망치고 있습니까?
Mad Physicist

답변:


95

불행히도 matplotlib 3.1.1 은 seaborn 히트 맵을 깨뜨 렸습니다 . 일반적으로 고정 된 눈금이있는 반전 된 축.
이것은 현재 개발 버전에서 수정되었습니다. 따라서 당신은

  • 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 2010 년

81

3.1.0과 3.1.1 사이의 matplotlib 회귀에있는 버그입니다. 다음과 같이 수정할 수 있습니다.

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)

4

내 코드에 다음 줄을 추가하여 해결했습니다 matplotlib==3.1.1.

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

NB. 이것이 작동하는 유일한 이유는 x 축이 변경되지 않았기 때문에 향후 mpl 버전에서 자신의 책임하에 사용하십시오.


3

matplotlib 3.1.2가 나왔습니다-conda-forge를 통해 Anaconda 클라우드에서 사용할 수 있지만 conda 설치를 통해 설치할 수 없었습니다. 수동 대안이 작동했습니다. github에서 matplotlib 3.1.2를 다운로드하고 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.
옥 Cacho에게

위는 MacOS에서 시도되었습니다. Windows 시나리오에 익숙하지 않지만 로컬 권한 문제인 것 같습니다.
rustyDev

응답 해 주셔서 감사합니다. 결국 이전 버전 (matplotlib-3.1.0)을 설치했습니다.
Jade Cacho


0

rustyDev는 conda-forge에 대해 맞지만 github 다운로드에서 수동 pip 설치를 할 필요가 없었습니다. 저에게는 Windows에서 직접 작동했습니다. 그리고 플롯은 다시 모두 멋집니다.

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

conda install -c conda-forge matplotlib

답변에 필요하지 않은 선택적 포인트 :

그 후 다른 단계를 시도했지만 필요하지 않습니다. conda 프롬프트에서 : conda search matplotlib --info에 새 버전 정보가 표시되지 않았으며 최신 정보는 3.1.1에 대한 것입니다. 따라서 pip를 사용하여 시도했지만 pip pip install matplotlib==3.1.2는 "요구 사항이 이미 충족되었습니다"라고 말합니다.

그런 다음 medium.com/@rakshithvasudev/…에 따라 버전을 가져 오면 python - import matplotlib - matplotlib.__version__3.1.2가 성공적으로 설치 되었음을 보여줍니다.

Btw, Spyder를 v4.0.0으로 업데이트 한 직후이 오류가 발생했습니다. 오류는 혼동 행렬의 플롯에 있습니다. 이것은 이미 몇 달 전에 언급되었습니다. stackoverflow.com/questions/57225685/… 이미이 문제에 연결되어 있습니다.


-1

conda 설치 matplotlib = 3.1.0

이것은 나를 위해 일했고 matplotlib를 3.1.1에서 3.1.0으로 다운 그레이드했으며 히트 맵이 올바르게 작동하기 시작했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.