Pandas DataFrame에서 히트 맵 만들기


112

Python의 Pandas 패키지에서 생성 된 데이터 프레임이 있습니다. Pandas 패키지에서 DataFrame을 사용하여 히트 맵을 생성하려면 어떻게해야합니까?

import numpy as np 
from pandas import *

Index= ['aaa','bbb','ccc','ddd','eee']
Cols = ['A', 'B', 'C','D']
df = DataFrame(abs(np.random.randn(5, 4)), index= Index, columns=Cols)

>>> df
          A         B         C         D
aaa  2.431645  1.248688  0.267648  0.613826
bbb  0.809296  1.671020  1.564420  0.347662
ccc  1.501939  1.126518  0.702019  1.596048
ddd  0.137160  0.147368  1.504663  0.202822
eee  0.134540  3.708104  0.309097  1.641090
>>> 

히트 맵이나 연구를 만들 때 무엇을 시도 했습니까? 더 많이 알지
학습자

@joelostblom 이것은 대답이 아니라 댓글이지만 문제는 댓글을 달 수있는 평판이 충분하지 않다는 것입니다. 매트릭스와 원래 배열의 출력 값이 완전히 다르기 때문에 조금 당황합니다. 열지도에 실제 값을 인쇄하고 싶습니다. 누군가 왜 이런 일이 발생하는지 설명해 줄 수 있습니까? 예 : * 원본 인덱스 데이터 : aaa / A = 2.431645 * 히트 맵의 인쇄 된 값 : aaa / A = 1.06192
Monitotier

@Monitotier 새로운 질문을하고 시도한 내용의 전체 코드 예제를 포함하십시오. 이것이 무엇이 잘못되었는지 알아낼 수 있도록 누군가에게 도움을 줄 수있는 가장 좋은 방법입니다! 관련성이 있다고 생각되면이 질문에 연결할 수 있습니다.
joelostblom

답변:


82

원하는 matplotlib.pcolor:

import numpy as np 
from pandas import DataFrame
import matplotlib.pyplot as plt

index = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
columns = ['A', 'B', 'C', 'D']
df = DataFrame(abs(np.random.randn(5, 4)), index=index, columns=columns)

plt.pcolor(df)
plt.yticks(np.arange(0.5, len(df.index), 1), df.index)
plt.xticks(np.arange(0.5, len(df.columns), 1), df.columns)
plt.show()

이것은 다음을 제공합니다.

출력 샘플


5
몇 가지 흥미로운 토론이있다 여기 에 대해 pcolorimshow.
LondonRob

1
… 또한 pcolormesh이러한 종류의 그래픽에 최적화되어 있습니다.
Eric O Lebigot 2019

180

오늘 이것을보고있는 사람들에게는 여기에heatmap() 설명 된 Seaborn 을 추천합니다 .

위의 예는 다음과 같이 수행됩니다.

import numpy as np 
from pandas import DataFrame
import seaborn as sns
%matplotlib inline

Index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
Cols = ['A', 'B', 'C', 'D']
df = DataFrame(abs(np.random.randn(5, 4)), index=Index, columns=Cols)

sns.heatmap(df, annot=True)

%matplotlib익숙하지 않은 사람들을위한 IPython 매직 기능은 어디에 있습니까 ?


팬더를 사용하지 않는 이유는 무엇입니까?
tommy.carstensen

9
Seaborn과 Pandas는 잘 작동하므로 Pandas를 사용하여 데이터를 올바른 모양으로 만들 수 있습니다. Seaborn은 정적 차트를 전문으로하며 Pandas DataFrame의 히트 맵을 간단하게 만듭니다.
Brideau

이 링크는 죽은 것 같습니다. 업데이트 할 수 있습니까!? 또한 위 코드를 import matplotlib.pyplot as plt어떻게 실행 합니까?
Cleb

안녕하세요 @Cleb, 아무데도 표시되지 않기 때문에 보관 된 페이지로 업데이트해야했습니다. pyplot과 함께 사용하기위한 문서를 살펴보십시오 : stanford.edu/~mwaskom/software/seaborn-dev/tutorial/…
Brideau

실제로 플롯을 보려면 import matplotlib.pyplot as plt대신 사용 %matplotlib inline하고로 끝내십시오 plt.show().
tsveti_iko

83

말마다 플롯이 필요하지 않고 테이블 형식으로 값을 표현하기 위해 색상을 추가하는 데 관심이 있다면 style.background_gradient()pandas 데이터 프레임 의 방법을 사용할 수 있습니다 . 이 방법은 예를 들어 JupyterLab 노트북에서 팬더 데이터 프레임을 볼 때 표시되는 HTML 테이블을 색상 화하며 결과는 스프레드 시트 소프트웨어에서 "조건부 서식"을 사용하는 것과 유사합니다.

import numpy as np 
import pandas as pd


index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
cols = ['A', 'B', 'C', 'D']
df = pd.DataFrame(abs(np.random.randn(5, 4)), index=index, columns=cols)
df.style.background_gradient(cmap='Blues')

여기에 이미지 설명 입력

자세한 사용법은 이전에 동일한 주제에 대해 제공 한보다 정교한 답변pandas 문서스타일링 섹션을 참조하십시오 .


4
젠장,이 대답은 실제로 제가 찾던 대답입니다. IMO는 더 높아야합니다 (+1).
ponadto

7
이 답변은 게시 된 질문에 대한 유효한 해결책이 아닙니다. Pandas 배경 그라데이션 색상은 각 행 또는 각 열을 개별적으로 고려하는 반면 matplotlib의 pcolor 또는 pcolormesh 색상은 전체 행렬을 고려합니다. 예를 들어 다음 코드 pd.DataFrame([[1, 1], [0, 3]]).style.background_gradient(cmap='summer') 는 각각 다른 색상을 가진 두 개의 테이블이있는 테이블을 생성합니다.
Toni Penya-Alba 2019

4
@ ToniPenya-Alba 문제는 pcolor 또는 pcolormesh의 동작을 복제하는 방법이 아니라 pandas 데이터 프레임에서 히트 맵을 생성하는 방법에 관한 것입니다. 자신의 목적을 위해 후자에 관심이 있다면 axis=None(pandas 0.24.0부터) 사용할 수 있습니다 .
joelostblom

2
@joelostblom "하나의 도구 또는 다른 동작 재현"에서와 같이 내 의견을 의미하지는 않았지만 "일반적으로 각 행 / 열에 대해 서로 다른 배율을 사용하는 대신 동일한 배율을 따르는 행렬의 모든 요소를 ​​원합니다." 지적했듯이, axis=None이를 달성하고 제 생각에는 답변의 일부가되어야합니다 (특히 문서화되지 않은 것 같기 때문에 0 )
Toni Penya-Alba

2
@ ToniPenya-Alba 나는 axis=None이러한 옵션 중 일부가 일반적으로 원하는 동작을 가능하게한다는 데 동의하기 때문에 몇 가지 다른 옵션과 함께 위에 링크 된 자세한 답변의 일부를 이미 만들었습니다 . 나는 또한 어제 문서의 부족을 발견하고 PR을 열었습니다 .
joelostblom

17

유용한 sns.heatmapAPI가 여기 있습니다 . 매개 변수를 확인하십시오. 많은 수가 있습니다. 예:

import seaborn as sns
%matplotlib inline

idx= ['aaa','bbb','ccc','ddd','eee']
cols = list('ABCD')
df = DataFrame(abs(np.random.randn(5,4)), index=idx, columns=cols)

# _r reverses the normal order of the color map 'RdYlGn'
sns.heatmap(df, cmap='RdYlGn_r', linewidths=0.5, annot=True)

여기에 이미지 설명 입력


4

당신이 팬더 DataFrame에서 대화 형 히트 맵을 원하고 당신이 Jupyter 노트북을 실행하는 경우 대화 형 위젯 시도 할 수 있습니다 Clustergrammer - 위젯 , NBViewer에 대화 형 노트북을 참조 여기에 , 문서를 여기에

여기에 이미지 설명 입력

더 큰 데이터 세트의 경우 개발중인 Clustergrammer2 WebGL 위젯 ( 여기에서 예제 노트북 )을 사용해 볼 수 있습니다.


1
와우 이거 정말 깔끔 해요! 파이썬에 오는 멋진 패키지를 보니 반갑습니다-R 매직을 사용하는 것에 지쳤습니다
Sos

2

의 작성자는 범주 형 데이터 프레임 으로 seaborn만 작업 하기 seaborn.heatmap원합니다 . 일반적이지 않습니다.

색인과 열이 숫자 및 / 또는 날짜 / 시간 값인 경우이 코드가 잘 작동합니다.

Matplotlib 히트 매핑 함수 pcolormesh에는 indices 대신 bin이 필요 하므로 데이터 프레임 인덱스에서 bin을 빌드하는 멋진 코드가 있습니다 (인덱스의 간격이 균등하지 않더라도!).

나머지는 간단 np.meshgrid하고 plt.pcolormesh.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def conv_index_to_bins(index):
    """Calculate bins to contain the index values.
    The start and end bin boundaries are linearly extrapolated from 
    the two first and last values. The middle bin boundaries are 
    midpoints.

    Example 1: [0, 1] -> [-0.5, 0.5, 1.5]
    Example 2: [0, 1, 4] -> [-0.5, 0.5, 2.5, 5.5]
    Example 3: [4, 1, 0] -> [5.5, 2.5, 0.5, -0.5]"""
    assert index.is_monotonic_increasing or index.is_monotonic_decreasing

    # the beginning and end values are guessed from first and last two
    start = index[0] - (index[1]-index[0])/2
    end = index[-1] + (index[-1]-index[-2])/2

    # the middle values are the midpoints
    middle = pd.DataFrame({'m1': index[:-1], 'p1': index[1:]})
    middle = middle['m1'] + (middle['p1']-middle['m1'])/2

    if isinstance(index, pd.DatetimeIndex):
        idx = pd.DatetimeIndex(middle).union([start,end])
    elif isinstance(index, (pd.Float64Index,pd.RangeIndex,pd.Int64Index)):
        idx = pd.Float64Index(middle).union([start,end])
    else:
        print('Warning: guessing what to do with index type %s' % 
              type(index))
        idx = pd.Float64Index(middle).union([start,end])

    return idx.sort_values(ascending=index.is_monotonic_increasing)

def calc_df_mesh(df):
    """Calculate the two-dimensional bins to hold the index and 
    column values."""
    return np.meshgrid(conv_index_to_bins(df.index),
                       conv_index_to_bins(df.columns))

def heatmap(df):
    """Plot a heatmap of the dataframe values using the index and 
    columns"""
    X,Y = calc_df_mesh(df)
    c = plt.pcolormesh(X, Y, df.values.T)
    plt.colorbar(c)

을 사용하여 호출하고을 사용하여 heatmap(df)확인하십시오 plt.show().

여기에 이미지 설명 입력

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