在本教程中,我们将使用名为 seaborn 的 Python 库以热图形式表示数据。该库用于基于以下内容可视化数据Matplotlib.
您将了解什么是热图、如何创建它、如何更改其颜色、调整其字体大小等等,所以让我们开始吧。
什么是热图?
热图是一种以二维形式表示数据的方法。数据值在图表中表示为颜色。热图的目标是提供信息的彩色视觉摘要。
创建热图
要在Python中创建热图,我们可以使用seaborn库。 seaborn 库构建在 Matplotlib 之上。 Seaborn 库提供了一个高级数据可视化界面,我们可以在其中绘制矩阵。
在本教程中,我们将使用以下 Python 组件:
- Python 3(我将使用 Python 3.7)
- Matplotlib
- NumPy
- Seaborn
要安装seaborn,请运行pip命令,如下所示:
pip install seaborn
Seaborn 支持以下图:
好的,现在让我们创建一个热图:
导入以下所需模块:
import numpy as np
import seaborn as sb
import matplotlib.pyplot as plt
我们导入了 numpy 模块来生成给定范围内的随机数数组,该数组将被绘制为热图。
data = np.random.rand(4, 6)
这将创建一个四行六列的二维数组。现在让我们将这些数组值存储在热图中。我们可以使用seaborn模块的heatmap函数创建热图。然后我们将数据传递如下:
heat_map = sb.heatmap(data)
使用 matplotlib,我们将在输出中显示热图:
plt.show()
恭喜!我们创建了第一个热图!
删除热图 x 刻度标签
热图中每个块的 x 轴和 y 轴值称为刻度标签。 Seaborn 默认添加刻度标签。如果我们想删除刻度标签,我们可以将seaborn热图的xticklabel或ytickelabel属性设置为False,如下所示:
heat_map = sb.heatmap(data, xticklabels=False, yticklabels=False)
设置热图 x 轴标签
我们可以使用 Matplotlib 的 xlabel 属性在 x 轴上添加标签,如下代码所示:
>>> plt.xlabel("Values on X axis")
结果如下:
删除热图 y 刻度标签
Seaborn 默认添加 y 轴标签。要删除它们,我们可以将 yticklabels 设置为 false。
heat_map = sb.heatmap(data, yticklabels=False)
设置热图 y 轴标签
您可以使用 Matplotlib 的 ylabel 属性在 y 轴上添加标签,如下所示:
>>> data = np.random.rand(4, 6)
>>> heat_map = sb.heatmap(data)
>>> plt.ylabel('Values on Y axis')
更改热图颜色
您可以通过使用热图的 cmap 属性的颜色图来更改 seaborn 热图的颜色。
考虑下面的代码:
>>> heat_map = sb.heatmap(data, cmap="YlGnBu")
>>> plt.show()
这里cmap等于YlGnBu,它代表以下颜色:
在 Seaborn 热图中,我们有三种不同类型的颜色图。
- 顺序色彩图
- 发散的调色板
- 离散数据
顺序色彩图
当数据范围从低值到高值时,您可以使用顺序颜色图。连续颜色图颜色代码可以与 heatmap() 函数或 kdeplot() 函数一起使用。
顺序颜色图包含以下颜色:
这张图片取自Matplotlib.org.
顺序立方体螺旋调色板
立方体螺旋是顺序颜色图的一种形式。当亮度线性增加以及色调略有差异时可以使用它。
Cubehelix 调色板如下所示:
您可以使用 cmap 属性在代码中实现此调色板:
>>> heat_map = sb.heatmap(data, cmap="cubehelix")
结果将是:
发散的调色板
当热图中的高值和低值很重要时,您可以使用发散调色板。
发散调色板创建了两种 HUSL 颜色之间的调色板。这意味着发散调色板在图表中包含两种不同的色调。
您可以在seaborn中创建发散调色板,如下所示:
import seaborn as sb
import matplotlib.pyplot as plt
>>> sb.palplot(sb.diverging_palette(200, 100, n=11))
>>> plt.show()
这里200是左侧调色板的值,100是右侧调色板的代码。变量 n 定义块的数量。在我们的例子中,它是 11。调色板如下:
离散数据
在 Seaborn 中,有一个名为 mpl_palette 的内置函数,它返回离散的颜色模式。 mpl_palette 方法将在调色板中绘制值。这个调色板是一个水平数组。
发散的调色板如下所示:
此输出是使用以下代码行实现的:
>>> sb.palplot(sb.mpl_palette("Set3", 11))
>>> plt.show()
参数 Set3 是调色板的名称,11 是调色板中离散颜色的数量。 seaborn 的 palplot 方法绘制给定调色板的水平数组中的值。
在热图上添加文本
要在热图上添加文本,我们可以使用 annot 属性。如果 annot 设置为 True,则文本将写入每个单元格上。如果定义了每个单元格的标签,您可以将标签分配给 annot 属性。
考虑以下代码:
>>> data = np.random.rand(4, 6)
>>> heat_map = sb.heatmap(data, annot=True)
>>> plt.show()
结果如下:
我们可以自定义 annot 值,稍后我们将看到。
调整热图字体大小
我们可以使用seaborn的font_scale属性来调整热图文本的字体大小,如下所示:
>>> sb.set(font_scale=2)
现在定义并显示热图:
>>> heat_map = sb.heatmap(data, annot=True)
>>> plt.show()
增加大小后,热图将如下所示:
Seaborn 热图颜色条
热图中的颜色条如下所示:
热图的属性cbar是一个布尔属性;它告诉它是否应该出现在情节中。如果未定义 cbar 属性,则默认情况下将在图中显示颜色条。要删除颜色条,请将 cbar 设置为 False:
>>> heat_map = sb.heatmap(data, annot=True, cbar=False)
>>> plt.show()
要添加颜色条标题,我们可以使用 cbar_kws 属性。
代码如下所示:
>>> heat_map = sb.heatmap(data, annot=True, cbar_kws={'label': 'My Colorbar'})
>>> plt.show()
在 cbar_kws 中,我们必须指定我们所引用的颜色条的属性。在我们的示例中,我们指的是颜色条的标签(标题)。
同样,我们可以改变颜色的方向。默认方向是垂直的,如上例所示。
要创建水平颜色条,请定义 cbar_kws 的方向属性,如下所示:
>>> heat_map = sb.heatmap(data, annot=True, cbar_kws={'label': 'My Colorbar', 'orientation': 'horizontal'})
>>> plt.show()
最终的颜色条将如下所示:
更改热图颜色条字体大小
如果我们需要更改seaborn所有组件的字体大小,可以使用Seaborn的font_scale属性。
让我们将比例设置为 1.8 并将比例 1 与 1.8 进行比较:
>>> sb.set(font_scale=1.8)
>>> heat_map = sb.heatmap(data, annot=True, cbar_kws={'label': 'My Colorbar', 'orientation': 'horizontal'})
>>> plt.show()
比例 1 的结果:
1.8 的比例将如下所示:
更改刻度轴的旋转
我们可以使用所需 ytick 或 xtick 标签的旋转属性来更改刻度标签旋转。
首先,我们这样定义热图:
>>> heat_map = sb.heatmap(data)
>>> plt.show()
这是一个包含随机数据的常规图,如前一节中所定义。
请注意下图中的原始 yticklabels:
要旋转它们,我们首先获取热图的 yticklabels,然后将旋转设置为 0:
>>> heat_map.set_yticklabels(heat_map.get_yticklabels(), rotation=0)
在 set_yticklabels 中,我们传递了两个参数。第一个获取热图的 yticklabel,第二个设置旋转。上面这行代码的结果将如下所示:
旋转属性可以是任意角度:
>>> heat_map.set_yticklabels(heat_map.get_yticklabels(), rotation=35)
在热图上添加文本和值
在前面的部分中,我们仅在热图上添加了值。在本节中,我们将在热图上添加值和文本。
考虑以下示例:
创建随机测试数据:
>>> data = np.random.rand(4, 6)
现在为我们将在热图上写入的文本创建一个数组:
>>> text = np.asarray([['a', 'b', 'c', 'd', 'e', 'f'], ['g', 'h', 'i', 'j', 'k', 'l'], ['m', 'n', 'o', 'p', 'q', 'r'], ['s', 't', 'u', 'v', 'w', 'x']])
现在我们必须将文本与值结合起来,并将结果作为标签添加到热图上:
>>> labels = (np.asarray(["{0}\n{1:.2f}".format(text,data) for text, data in zip(text.flatten(), data.flatten())])).reshape(4,6)
好的,所以在这里我们传递了文本数组和数据数组中的数据,然后将两个数组展平为更简单的文本并将它们压缩在一起。那么结果就是reshaped创建另一个相同大小的数组,该数组现在包含文本和数据。
新数组存储在名为 labels 的变量中。标签变量将使用 annot 添加到热图中:
>>> heat_map = sb.heatmap(data, annot=labels, fmt='')
添加除 True 和 False 之外的注释时,应添加 fmt 属性。
绘制该热图时,结果如下:
使用seaborn 热图非常简单。我希望您觉得本教程有用。
谢谢。