Создание тепловой карты из панд 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
>>>
Ответы
Ответ 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 Это не ответ, это комментарий, но проблема в том, что у меня недостаточно репутации, чтобы комментировать.
Я немного сбит с толку, потому что выходное значение матрицы и исходного массива совершенно разные. Я хотел бы напечатать на тепловой карте реальные значения, а не некоторые другие. Может кто-нибудь объяснить мне, почему это происходит. Например:
Ответ 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]()