Подтвердить что ты не робот

Создание тепловой карты из панд DataFrame

У меня есть dataframe, сгенерированный из пакета Python Pandas. Как я могу создать тепловую карту с помощью DataFrame из пакета Pandas.

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
>>> 
4b9b3361

Ответ 1

Вы хотите 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()

Ответ 2

Для людей, которые смотрят на это сегодня, я бы рекомендовал Seaborn 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)

jbcTG.png

Где %matplotlib - магическая функция IPython для незнакомых.

Ответ 3

Если вам не нужен график, скажем, и вы просто заинтересованы в добавлении цвета для представления значений в формате таблицы, вы можете использовать метод style.background_gradient() фрейма данных pandas. Этот метод раскрашивает таблицу HTML, которая отображается при просмотре фреймов данных pandas, например, в блокноте JupyterLab, и результат аналогичен использованию "условного форматирования" в программном обеспечении электронных таблиц:

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.

Ответ 4

Полезно 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)

введите описание изображения здесь

Ответ 5

Если вам нужна интерактивная тепловая карта из DataFrame Pandas, и вы используете ноутбук Jupyter, вы можете попробовать интерактивный виджет Clustergrammer-Widget, см. Интерактивную записную книжку на NBViewer здесь, документацию здесь

enter image description here

А для больших наборов данных вы можете попробовать виджет Clustergrammer2 WebGL, находящийся в разработке (пример записной книжки здесь)

Ответ 6

@joelostblom Это не ответ, это комментарий, но проблема в том, что у меня недостаточно репутации, чтобы комментировать.

Я немного сбит с толку, потому что выходное значение матрицы и исходного массива совершенно разные. Я хотел бы напечатать на тепловой карте реальные значения, а не некоторые другие. Может кто-нибудь объяснить мне, почему это происходит. Например:

  • Исходные индексированные данные: aaa/A = 2.431645

  • напечатанные значения на тепловой карте: aaa/A = 1.06192

Ответ 7

Обратите внимание, что авторы seaborn хотят, чтобы seaborn.heatmap работал только с категориальными фреймами данных. Это не вообще.

Если ваш индекс и столбцы имеют числовые значения и/или значения даты и времени, этот код будет вам полезен.

Функция теплового отображения Matplotlib pcolormesh требует бункеры вместо индексов, поэтому есть некоторый причудливый код для построения бинов из ваших индексов фрейма данных (даже если ваш индекс не расположен равномерно!).

Остальное просто 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().

enter image description here