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 2015

1
…またpcolormesh、この種のグラフィック用に最適化されています。
エリックOレビゴット

180

今日これを見ている人のために、私はここにheatmap()記載されているようにシーボーンをお勧めします

上記の例は次のようになります。

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 DataFrameからのヒートマップを簡単に作成できます。
Brideau

このリンクは死んでいるようです。更新できますか?さらに、上記のコードをどのように実行しimport matplotlib.pyplot as pltますか?
Cleb 2016年

こんにちは@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 Notebookなどでパンダデータフレームを表示したときに表示される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')

ここに画像の説明を入力してください

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


4
くそー、この答えは実際に私が探していたものです。IMO、より高い(+1)。
ponadto

7
この回答は、投稿された質問に対する有効な解決策ではありません。Pandasの背景のグラデーションの色は、行ごとまたは列ごとに個別に考慮されますが、matplotlibのpcolorまたはpcolormeshの色付けは、マトリックス全体を考慮します。たとえば、次のコードの pd.DataFrame([[1, 1], [0, 3]]).style.background_gradient(cmap='summer') 結果、2つのテーブルがあり、それぞれが異なる色で表示されます。
Toni Penya-Alba

4
@ ToniPenya-Alba問題は、pcolorまたはpcolormeshの動作を再現する方法ではなく、pandasデータフレームからヒートマップを生成する方法についてです。自分の目的で後者に興味がある場合は、使用できますaxis=None(pandas 0.24.0以降)。
joelostblom

2
@joelostblom「1つのツールまたは別の動作を再現する」のようにコメントするつもりはありませんでしたが、「通常、行/列ごとに異なるスケールを持つのではなく、同じスケールに従うマトリックスのすべての要素が必要です」のように。あなたが指摘するように、それを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

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

ここに画像の説明を入力してください

より大きなデータセットの場合、開発中のClustergrammer2 WebGLウィジェットを試すことができます(ノートブックの例はこちら


1
すごいすごい!Pythonにいくつかの素敵なパッケージが登場するのを見るのは良いことです-Rマジックを使用しなければならないことにうんざりしています
Sos

2

seabornのみの作者が欲しいことに注意してください seaborn.heatmap、カテゴリカルデータフレームことに。それは一般的ではありません。

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

Matplotlibヒートマッピング関数にpcolormeshは、インデックスの代わりにビンが必要です。そのため、データフレームインデックスからビンを作成するためのいくつかの凝ったコードがあります(インデックスが等間隔でなくても!)。

残りは単純である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()ます。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.