利用熊猫数据框架制作热图

我有一个从 Python 的熊猫软件包生成的数据框架。我如何使用熊猫软件包的数据框架生成热图。

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
>>>
309625 次浏览

你想要 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()

这意味着:

Output sample

对于今天看到这一点的人,我会推荐海运 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 的人来说是一个神奇的函数。

有用的 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

如果每个 say 不需要一个绘图,并且您只是对添加颜色以表格格式表示值感兴趣,那么可以使用熊猫数据框架的 style.background_gradient()方法。这种方法会在浏览大熊猫数据框时显示的 HTML 表格(比如 Jupiter/terLab 笔记本)上着色,其结果类似于在电子试算表中使用“条件格式”:

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

有关详细用法,请参阅 更详细的答案我提供的同一主题以前和 造型部分的熊猫文件

如果你想要一个熊猫数据框架的交互式热图,并且你正在运行一个 Jupiter 笔记本,你可以试试交互式小部件 Clustergrammer-Widget,参见 NBViewer 给你上的交互式笔记本,文档 给你

enter image description here

对于较大的数据集,您可以尝试正在开发的 Clustergrammer2 WebGL 小部件(例如笔记本 给你)

请注意,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()查看它。

enter image description here

令人惊讶的是,没有人提到更多的能力,交互性和更容易使用的替代品。

A)你可以使用阴谋论:

  1. 只要两句台词,你就会得到:

  2. 互动性,

  3. 光滑的鳞片,

  4. 基于整个数据框架而不是单个列的颜色,

  5. 轴上的列名和行索引,

  6. 放大,

  7. 平移,

  8. 内置的一键功能,保存为 PNG 格式,

  9. 自动缩放,

  10. 比较盘旋,

  11. 显示数值的气泡,所以热图仍然看起来不错,你可以看到 任何你想要的价值观:

import plotly.express as px
fig = px.imshow(df.corr())
fig.show()

enter image description here

B)你也可以使用 Bokeh:

所有的功能都一样,只是有点麻烦。但是,如果你不想选择阴谋,仍然想要所有这些东西,这仍然是值得的:

from bokeh.plotting import figure, show, output_notebook
from bokeh.models import ColumnDataSource, LinearColorMapper
from bokeh.transform import transform
output_notebook()
colors = ['#d7191c', '#fdae61', '#ffffbf', '#a6d96a', '#1a9641']
TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"
data = df.corr().stack().rename("value").reset_index()
p = figure(x_range=list(df.columns), y_range=list(df.index), tools=TOOLS, toolbar_location='below',
tooltips=[('Row, Column', '@level_0 x @level_1'), ('value', '@value')], height = 500, width = 500)


p.rect(x="level_1", y="level_0", width=1, height=1,
source=data,
fill_color={'field': 'value', 'transform': LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max())},
line_color=None)
color_bar = ColorBar(color_mapper=LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max()), major_label_text_font_size="7px",
ticker=BasicTicker(desired_num_ticks=len(colors)),
formatter=PrintfTickFormatter(format="%f"),
label_standoff=6, border_line_color=None, location=(0, 0))
p.add_layout(color_bar, 'right')


show(p)

enter image description here

您可以将 seborn 与 DataFrame corr ()一起使用来查看列之间的相关性

sns.heatmap(df.corr())