web-dev-qa-db-ja.com

pandas DataFrameからヒートマップを作成する

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
>>> 
91
Curious

matplotlib.pcolorが必要です:

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

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

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

今日これを見ている人のために、文書化されているようにSeaborn heatmap()here をお勧めします。

上記の例は次のように実行されます。

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マジック関数です。

141
Brideau

たとえば、プロットを必要とせず、表形式で値を表すために色を追加したいだけの場合は、pandasデータフレームのstyle.background_gradient()メソッドを使用できます。 。このメソッドは、たとえばpandasデータフレームを表示するときに表示されるHTMLテーブルを色付けします。 JupyterLab Notebookと結果は、スプレッドシートソフトウェアで「条件付き書式設定」を使用するのと似ています。

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

enter image description here

詳細な使用方法については、 より詳細な回答 を参照してください。以前に同じトピックで提供したものと pandasドキュメントのスタイリングセクション .

39
joelostblom

便利なsns.heatmap apiは ここ です。パラメータを確認してください。それらのかなりの数があります。例:

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)

enter image description here

14
Brad Solomon

Pandas DataFrameからインタラクティブヒートマップが必要で、Jupyterノートブックを実行している場合、インタラクティブウィジェット Clustergrammer-Widget を試すことができます。NBViewerのインタラクティブノートブックを参照してください here 、ドキュメント here

enter image description here

そして、より大きなデータセットについては、開発中 Clustergrammer2 WebGLウィジェット(ノートブックの例 ここ )を試すことができます

1
Nick Fernandez

カテゴリデータフレームを使用するには、seabornのみ wantseaborn.heatmapの作成者に注意してください。一般的ではありません。

インデックスと列が数値または日時値である場合、このコードは役立ちます。

Matplotlibヒートマッピング関数pcolormeshには、indicesではなくbinsが必要です。データフレームインデックス(インデックスが等間隔でない場合でも!)。

残りは単純にnp.meshgridplt.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()を使用して表示します。

enter image description here

0
OrangeSherbet