Skip to content

Heatmap(热图)是一种通过颜色编码二维数据的可视化图形,通常用于表示矩阵或表格中的数值关系。它使用不同的颜色来表示不同的数值大小,颜色的变化能够直观地显示数据的分布和模式。热图的每个单元格代表数据中的一个值,颜色强度与数据值的大小相关联。它能够帮助研究人员、分析师等从繁杂的数值中提取有价值的信息。

普通热图严格来说不属于热图,而是颜色图(Color Image)。其生成过程不涉及数据转换计算,而是将数据简单映射到一个网格矩阵中,然后根据预先指定的颜色序列为网格矩阵中的数据赋予不同的颜色,从而利用颜色深浅来表示数据的大小。这种普通热图借助于人眼对颜色的敏感度,可以快速发现统计特征(如颜色深浅与数据大小的关系),相比直接观察数据,具有显著优势。

flights.csv

penguins.csv

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

flights = pd.read_csv('../Data/flights.csv').pivot(index="year", columns="month", values="passengers")
"""
month  April  August  December  February  ...  May  November  October  September
year                                      ...                                   
1949     129     148       118       118  ...  121       104      119        136
1950     135     170       140       126  ...  125       114      133        158
1951     163     199       166       150  ...  172       146      162        184
1952     181     242       194       180  ...  183       172      191        209
1953     235     272       201       196  ...  229       180      211        237
1954     227     293       229       188  ...  234       203      229        259
1955     269     347       278       233  ...  270       237      274        312
1956     313     405       306       277  ...  318       271      306        355
1957     348     467       336       301  ...  355       305      347        404
1958     348     505       337       318  ...  363       310      359        404
1959     396     559       405       342  ...  420       362      407        463
1960     461     606       432       391  ...  472       390      461        508

[12 rows x 12 columns]
"""

flights_min = np.min(flights)
"""
np.int64(104)
"""

flights_max = np.max(flights)
"""
np.int64(622)
"""

flights_norm = mpl.colors.Normalize(vmin=flights_min, vmax=flights_max)

penguins = pd.read_csv('../Data/penguins.csv')
penguins_data = penguins.drop(columns=['species', 'island', 'sex']).fillna(1)
"""
     culmen_length_mm  culmen_depth_mm  flipper_length_mm  body_mass_g
0                39.1             18.7              181.0       3750.0
1                39.5             17.4              186.0       3800.0
2                40.3             18.0              195.0       3250.0
3                 1.0              1.0                1.0          1.0
4                36.7             19.3              193.0       3450.0
..                ...              ...                ...          ...
339               1.0              1.0                1.0          1.0
340              46.8             14.3              215.0       4850.0
341              50.4             15.7              222.0       5750.0
342              45.2             14.8              212.0       5200.0
343              49.9             16.1              213.0       5400.0

[344 rows x 4 columns]
"""

penguins_min = np.min(penguins_data)
"""
np.float64(0.0)
"""

penguins_max = np.max(penguins_data)
"""
np.float64(6300.0)
"""

penguins_norm = mpl.colors.LogNorm(vmin=penguins_min, vmax=penguins_max)

cmap = plt.cm.viridis

image.png

image.png

Matplotlib:imshow

matplotlib.axes.Axes.imshow — Matplotlib 3.10.1 documentation

Interpolations for imshow — Matplotlib 3.10.1 documentation

imshow(X, cmap=None, norm=None, *, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, colorizer=None, origin=None, extent=None, interpolation_stage=None, filternorm=True, filterrad=4.0, resample=None, url=None, data=None, **kwargs)

以图像形式(即在二维规则栅格上)显示数据。输入可以是实际的RGB(A)数据,也可以是二维标量数据,这些数据将被渲染为伪彩色图像。对于显示灰度图像,请使用参数cmap='gray', vmin=0, vmax=255设置颜色映射。

用于渲染图像的像素数量由Axes的大小和Figure的DPI设置。当图像重采样时,这可能导致混叠伪影,因为显示的图像大小通常不会与X的大小匹配。

  1. **X:**图像数据。支持的数组形状包括:

  2. (M, N):具有标量数据的图像。值通过normcmap映射到颜色。

  3. (M, N, 3):一个具有RGB值(浮点数0-1或整数0-255)的图像。

  4. (M, N, 4):一个具有RGBA值(浮点数0-1或整数0-255)的图像,即包括透明度。

  5. **alpha:**透明度混合值,介于 0(透明)和 1(不透明)之间。如果是一个数组则形状必须与 X 相同,透明度混合值将依次应用于每个像素。

  6. **aspect:**Axes的纵横比。此参数对于图像尤其相关,因为它决定了数据像素是否为正方形。此参数是显式调用Axes.set_aspect的快捷方式。通常为None(默认值),表示使用rcParams["image.aspect"](默认值:'equal')。然而,如果图像使用不包含Axes数据变换的变换,则None表示完全不修改轴宽高比(在这种情况下,如果需要,可以直接调用Axes.set_aspect)。

  7. **'equal':**确保宽高比为 1。像素将是正方形(除非在数据坐标中使用extent显式地将像素大小设置为非正方形)。

  8. **'auto':**保持Axes固定,并调整宽高比,使数据适合Axes。通常,这将导致非正方形像素。

  9. **origin:**将数组的[0, 0]索引放置在Axes的左上角('upper')或左下角('lower')。可选约定(默认)rcParams["image.origin"]='upper'通常用于矩阵和图像。注意,对于'lower',垂直轴向上,而对于'upper',则向下。

  10. **extent:**数据坐标中图像将填充的边界框。这些值可能是单位值,并且与轴的单位相匹配。图像将分别沿 x 轴和 y 轴拉伸以填充框。默认范围由以下条件确定。像素在数据坐标中具有单位大小。它们的中心位于整数坐标上,并且其中心坐标在水平方向上从 0 到 columns-1,在垂直方向上从 0 到 rows-1。请注意,垂直轴的方向以及顶部和底部的默认值取决于原点:

  11. 对于origin == 'upper',默认是extent=(-0.5, numcols-0.5, numrows-0.5, -0.5)

  12. 对于origin == 'lower',默认是extent=(-0.5, numcols-0.5, -0.5, numrows-0.5)

  13. **resample:**当为True时,使用完整的重采样方法。当为False时,只有当输出图像大于输入图像时才进行重采样。默认rcParams["image.resample"]=True

  14. **interpolation:**使用的插值方法。支持的值有'none', 'auto'(默认,rcParams["image.interpolation"]), 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos', 'blackman'。使用插值方法将数据 X 重采样到图形画布上图像的像素大小,以对数据进行上采样或下采样。一些插值方法需要一个额外的半径参数,该参数可以通过filterrad设置。此外,抗锯齿图像缩放过滤器由参数filternorm控制。

  15. 如果设置为'none',则对于 ps、pdf 和 svg 后端,不会发生下采样或上采样,图像数据将作为原生图像传递给后端。请注意,不同的 ps、pdf 和 svg 查看器可能以不同的方式显示这些原始像素。对于其它后端则和'nearest'相同。

  16. resam如果设置为默认的'auto',则当图像上采样超过三倍因子时(即显示像素数至少是数据数组大小的三倍),将使用'nearest'插值。如果上采样率小于 3,或者图像下采样,则使用'hanning'插值作为抗锯齿滤波器,除非图像恰好以两倍或一倍因子上采样。

  17. interpolation_stage:

  18. **'data':**在用户提供的数据上执行插值。这在在上采样期间在像素之间进行插值时很有用。

  19. **'rgba':**在应用颜色映射后,在 RGBA 空间内执行插值。这在下采样和视觉上组合像素时很有用。

  20. **'auto'(默认):**自动选择合适的插值阶段。在下采样或者在采样率小于3的上采样时使用'rgba',在采样率更高的上采样时使用'data'

  21. **filternorm:**这是一个用于抗锯齿图像缩放过滤器的参数。如果设置为True(默认),则过滤器将归一化整数值并纠正舍入误差。它不对源浮点值进行任何操作,它仅根据 1.0 的规则纠正整数,这意味着像素权重的总和必须等于 1.0。因此,过滤器函数必须产生正确形状的图形。

  22. **filterrad:**过滤器的半径(默认4.0),适用于具有半径参数的过滤器,即当插值方式为:'sinc''lanczos''blackman'时。

fig = plt.figure(figsize=(8, 8), dpi=100, layout="constrained")
ax = fig.add_subplot(1, 1, 1)

ax.imshow(flights, cmap=cmap, norm=flights_norm, alpha=1,
          aspect='equal',
          origin='upper'
          )
"""
<matplotlib.image.AxesImage at 0x17451151880>
"""
fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=flights_norm), shrink=0.79, label='Passengers', ax=ax)
ax.set_xticks(ticks=np.linspace(0, 11, 12), labels=flights.columns, rotation=45)
ax.set_yticks(ticks=np.linspace(0, 11, 12), labels=flights.index, rotation=45)
ax.set_xlabel('Months')
ax.set_ylabel('Years')

plt.show()

image.png

Matplotlib:matshow

matplotlib.axes.Axes.matshow — Matplotlib 3.10.1 documentation

matshow(Z, **kwargs)

将 2D 矩阵或数组的值绘制为彩色图像。矩阵将按照打印的方式显示,第一行在顶部。行和列的编号从零开始。这是一个封装imshow的便利函数,用于设置显示矩阵的有用默认值。特别是:

  1. 设置origin='upper'

  2. 设置interpolation='nearest'

  3. 设置aspect='equal'

  4. 刻度线放置在左侧和上方。

  5. 刻度线格式化为显示整数索引。

fig = plt.figure(figsize=(8, 8), dpi=100, layout="constrained")
ax = fig.add_subplot(1, 1, 1)

ax.matshow(flights, cmap=cmap, norm=flights_norm, alpha=1)
"""
<matplotlib.image.AxesImage at 0x17453202cf0>
"""
fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=flights_norm), shrink=0.77, label='Passengers', ax=ax)
ax.set_xticks(ticks=np.linspace(0, 11, 12), labels=flights.columns, rotation=45)
ax.set_yticks(ticks=np.linspace(0, 11, 12), labels=flights.index, rotation=45)
ax.set_xlabel('Months')
ax.set_ylabel('Years')

plt.show()

image.png

Matplotlib:pcolor

matplotlib.axes.Axes.pcolor — Matplotlib 3.10.1 documentation

pcolor(*args, shading=None, alpha=None, norm=None, cmap=None, vmin=None, vmax=None, colorizer=None, data=None, **kwargs)

创建一个具有非规则矩形网格的伪彩色图。XY可以用来指定四边形的角。XYC参数仅接受位置参数。对于大型数组,pcolor()可能非常慢。在大多数情况下应该使用类似但速度快的多的pcolormesh

  1. **X, Y:**四边形顶点坐标。如果X和/或Y是 1-D 数组或列向量,它们将根据需要扩展为适当的 2D 数组,形成一个矩形网格。

  2. 如果shading='flat'XY的维度应比 C 大一个,并且四边形因C[i, j]的值而着色。如果XYC的维度相等,将引发警告,并忽略C的最后一行和最后一列。

  3. 如果shading='nearest'XY的维度应与C相同(如果不相同,将引发 ValueError)。颜色C[i, j]将位于(X[i, j], Y[i, j])的中心。

  4. **C:**颜色映射的值。

  5. **shading:**四边形的填充样式。可能的值:

  6. **'flat':**每个四边形使用一种纯色。四边形(i, j),(i+1, j),(i, j+1),(i+1, j+1)的颜色由C[i, j]给出。

  7. **'nearest':**每个网格点将有一个颜色,颜色中心位于点上,延伸到相邻网格中心之间的一半。

  8. **'auto':**如果XY的维度比C大一个,则选择'flat'。如果维度相同,则选择'nearest'

  9. **edgecolors:**边缘颜色。默认为'none'。单数形式edgecolor是一个别名。可能的值:

  10. 'none'**或'':**无边缘。

  11. None:rcParams["patch.edgecolor"](默认:'black')将被使用。注意,目前rcParams["patch.force_edgecolor"](默认:False )必须为True才能使用。

  12. **'face':**使用相邻的面颜色。

  13. 颜色或颜色序列

  14. **snap:**是否将网格捕捉到像素边界。

  15. **antialiaseds:**默认情况下,如果使用默认的edgecolors="none",则该参数为False。这消除了在补丁边界处的伪线,并且无论alpha的值如何都有效。否则该参数默认从rcParams["patch.antialiased"](默认:True)获取。如果alpha为1,则可能更喜欢描边边缘,但会导致伪影。

fig = plt.figure(figsize=(8, 8), dpi=100, layout="constrained")
ax = fig.add_subplot(1, 1, 1)

x = np.linspace(-0.5, 11.5, 13)
y = np.linspace(11.5, -0.5, 13)
X, Y = np.meshgrid(x, y)

ax.pcolor(X, Y, flights, cmap=cmap, norm=flights_norm, alpha=1,
          shading='flat'
          )
"""
<matplotlib.collections.PolyQuadMesh at 0x1745204c920>
"""
fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=flights_norm), shrink=1, label='Passengers', ax=ax)
ax.set_xticks(ticks=np.linspace(0, 11, 12), labels=flights.columns, rotation=45)
ax.set_yticks(ticks=np.linspace(11, 0, 12), labels=flights.index, rotation=45)
ax.set_xlabel('Months')
ax.set_ylabel('Years')

plt.show()

image.png

fig = plt.figure(figsize=(8, 8), dpi=100, layout="constrained")
ax = fig.add_subplot(1, 1, 1)

x = np.linspace(0, 11, 12)
y = np.linspace(11, 0, 12)
X, Y = np.meshgrid(x, y)

ax.pcolor(X, Y, flights, cmap=cmap, norm=flights_norm, alpha=1,
          shading='nearest'
          )
"""
<matplotlib.collections.PolyQuadMesh at 0x1745391d0d0>
"""
fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=flights_norm), shrink=1, label='Passengers', ax=ax)
ax.set_xticks(ticks=np.linspace(0, 11, 12), labels=flights.columns, rotation=45)
ax.set_yticks(ticks=np.linspace(11, 0, 12), labels=flights.index, rotation=45)
ax.set_xlabel('Months')
ax.set_ylabel('Years')

plt.show()

image.png

Matplotlib:pcolormesh

matplotlib.axes.Axes.pcolormesh — Matplotlib 3.10.1 documentation

pcolormesh(*args, alpha=None, norm=None, cmap=None, vmin=None, vmax=None, colorizer=None, shading=None, antialiased=False, data=None, **kwargs)

pcolormeshpcolor 类似。它速度更快,在大多数情况下都是首选。

fig = plt.figure(figsize=(8, 8), dpi=100, layout="constrained")
ax = fig.add_subplot(1, 1, 1)

x = np.linspace(0, 11, 12)
y = np.linspace(11, 0, 12)
X, Y = np.meshgrid(x, y)

ax.pcolormesh(X, Y, flights, cmap=cmap, norm=flights_norm, alpha=1,
              shading='nearest'
              )
"""
<matplotlib.collections.QuadMesh at 0x174533f1550>
"""
fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=flights_norm), shrink=1, label='Passengers', ax=ax)
ax.set_xticks(ticks=np.linspace(0, 11, 12), labels=flights.columns, rotation=45)
ax.set_yticks(ticks=np.linspace(11, 0, 12), labels=flights.index, rotation=45)
ax.set_xlabel('Months')
ax.set_ylabel('Years')

plt.show()

image.png

Seaborn:heatmap

seaborn.pydata.org

sns.heatmap(data, *, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)

将矩形数据绘制为颜色编码矩阵。这是一个Axes级别函数,如果ax参数未提供,则将绘制热图到当前活动的Axes中。这部分Axes空间将被占用并用于绘制颜色条,除非cbarFalsecbar_ax提供了单独的Axes。

**kwargs其他所有关键字参数都传递给matplotlib.axes.Axes.pcolormesh()

  1. **robust:**如果为Truevminvmax缺失,则使用稳健分位数而不是极端值来计算颜色映射范围。默认为False

  2. **square:**如果为True,则将 Axes 的纵横比设置为'equal',以便每个单元格都是方形。

  3. **annot:**如果为True,则在每个单元格中写入数据值。如果是一个与data形状相同的数组,则使用它来注释热图,而不是使用数据。请注意,DataFrame 将根据位置而不是索引进行匹配。

  4. **fmt:**添加注释时使用的字符串格式代码。默认为'.2g'

  5. **annot_kws:**当annotTrue时,传递给matplotlib.axes.Axes.text()的关键字参数。

  6. **linewidths:**用于分隔每个单元格的线的宽度。默认为0。

  7. **linecolor:**分隔每个单元格的线条颜色。默认'white'

  8. **cbar:**是否绘制色条。默认为True

  9. **cbar_kws:**传递给matplotlib.figure.Figure.colorbar()的关键字参数。

  10. **cbar_ax:**绘制色条的区域,否则占用主 Axes 的空间。

  11. **xticklabels、yticklabels:**如果为True,则绘制数据框的列名或行名。如果为列表,则绘制这些替代标签。如果为整数,则使用列名或行名,但仅绘制每n个标签。如果为'auto',则尝试密集绘制不重叠的标签。

  12. mask:**掩码数组。**如果传入,对应True的单元格中不会显示数据。缺失值的单元格将自动被屏蔽。

fig = plt.figure(figsize=(8, 8), dpi=100, layout="constrained")
ax = fig.add_subplot(1, 1, 1)

sns.heatmap(flights, cmap=cmap, norm=flights_norm, square=True,

            mask=flights<204,

            annot=True,
            fmt='.2f',
            annot_kws={"fontsize": 8, 'color': 'r'},

            linewidths=2,
            linecolor='k',

            cbar=True,
            cbar_kws={"label": "Passengers", 'shrink': 0.855},
            cbar_ax=None,

            xticklabels='auto',
            yticklabels='auto',

            ax=ax
            )
"""
<Axes: xlabel='month', ylabel='year'>
"""

plt.show()

image.png

Seaborn:clustermap

seaborn.clustermap — seaborn 0.13.2 documentation

linkage — SciPy v1.14.1 Manual

docs.scipy.org

sns.clustermap(data, *, pivot_kws=None, method='average', metric='euclidean', z_score=None, standard_scale=None, figsize=(10, 10), cbar_kws=None, row_cluster=True, col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, col_colors=None, mask=None, dendrogram_ratio=0.2, colors_ratio=0.03, cbar_pos=(0.02, 0.8, 0.05, 0.18), tree_kws=None, **kwargs)

将矩阵数据集绘制为层次聚类热图。该函数需要 scipy 可用。**kwargs所有其他关键字参数都传递给heatmap()

  1. data:**用于聚类的矩形数据。**不能包含空值

  2. **pivot_kws:**如果data是整洁的 DataFrame,可以提供用于pivot的关键字参数来创建矩形DataFrame。

  3. **row_cluster、col_cluster:**如果True ,对行或列进行聚类。

  4. **method:**用于计算聚类的链接方法。参阅scipy.cluster.hierarchy.linkage()文档。

  5. **metric:**用于数据的距离度量。参阅scipy.spatial.distance.pdist()文档。要使用不同的度量(或方法)用于行和列,可以分别构建链接矩阵,并将它们作为{row,col}_linkage参数提供。

  6. **row_linkage、col_linkage:**行或列的预计算链接矩阵。参见scipy.cluster.hierarchy.linkage()了解具体格式。

  7. **row_colors、col_colors:**用于标记行或列的颜色列表。可用于评估组内样本是否聚集在一起。可以使用嵌套列表或 DataFrame来表示多级颜色标记。如果作为pandas.DataFramepandas.Series提供,颜色标签将提取自DataFrames 的列名或Series 的名称。DataFrame/Series颜色也将通过其索引与数据匹配,确保颜色按正确顺序绘制。

  8. **dendrogram_ratio、colors_ratio:**图形大小中用于两个边缘元素的比例。如果给出一对,则对应于(行,列)比例。

  9. **z_score:**是否计算**行(0)**或**列(1)**的z分数。z分数为:z = (x - mean)/std。这确保了每行(列)的平均值为 0,方差为 1。

  10. **standard_scale:**对每一**行(0)**或每一**列(1)**进行标准化,即(x - min)/ max。

  11. **cbar_pos:**Figure中颜色条Axes的位置,形如(left, bottom, width, height)的元组。设置为None将禁用颜色条。

  12. **tree_kws:**用于绘制树状图线的matplotlib.collections.LineCollection参数。

from matplotlib.patches import Patch
a = sns.clustermap(penguins_data, cmap=cmap, norm=penguins_norm,

                   mask=None,

                   annot=False,

                   linewidths=0,

                   cbar_kws=None,
                   cbar_pos=(1, 0.071, 0.05, 0.735),

                   xticklabels='auto',
                   yticklabels=[],

                   row_cluster=True,
                   col_cluster=False,
                   method='weighted',
                   metric='mahalanobis',
                   row_linkage=None,
                   col_linkage=None,
                   row_colors=penguins['species'].map({'Adelie': 'r', 'Chinstrap': 'g', 'Gentoo': 'b'}),
                   col_colors=None,
                   dendrogram_ratio=0.2,
                   colors_ratio=0.02,
                   tree_kws=None,

                   z_score=None,
                   standard_scale=None,

                   figsize=(10,10)
                   )
"""
<seaborn.matrix.ClusterGrid at 0x2a739377bc0>
"""
p1 = Patch(facecolor='r')
p2 = Patch(facecolor='g')
p3 = Patch(facecolor='b')
a.figure.legend([p1, p2, p3], ['Adelie', 'Chinstrap', 'Gentoo'], loc='center left')

image.png

Comments