如何创建热力图

如何打造炙热的时尚之图' (How to Create a Sizzling Fashion Masterpiece)

创建一个多维分段线图

你可能听说过热力图。那些用来表示几个(通常是3个)数据维度的二维色彩编码网格;例如,下面的热力图显示了基于月份和年份的南部落基山脉的平均温度。

一张热力图显示了1950年到2020年南部落基山脉的平均温度。[CC BY-SA 4.0]

当我需要可视化一些Strava数据时,我想到了热力图。我想通过查看我在每个比赛的42.2公里中的配速和心率(区间)来比较我最近参加的一些马拉松比赛。这给我提出了一个线图的想法,将每个1公里间隔作为x值,将这些间隔期间的配速作为y值。但是在这些间隔期间的心率(作为努力的一种衡量)怎么办?标准的Matplotlib(我选择的图形库)线图没有提供一种直接的方式来编码这样的额外维度,因为诸如线条颜色、粗细和样式等属性是固定的,并作为整体应用于图形。对于我的用例,我希望能够改变各个线段的属性,以便我可以使用颜色来显示比赛不同部分的心率区间。

这个问题相对简单,也是一个很有用的例子,说明何时以及为什么要超越Matplotlib的默认内置功能。基本思路是分别绘制构成线图的每个线段。这样,我们可以单独控制每个线段的视觉属性,以便在这种情况下使用线段的颜色来表示心率等信息。

我们可以使用Matplotlib的LineCollection来实现这一点,它是一种方便的方式,可以绘制具有单独颜色和宽度的多条线(或线段)。为此,我们需要将我们的(x,y)点列表转换为每个线段的起始和结束坐标的列表。例如,给定以下(x,y)点…

(x0, y0), (x1, y1), …, (xn, yn)

…我们需要生成以下线段列表:

[ [(x0, y0), (x1, y1)], [(x1, y1), (x2, y2)], …, [(xn-1, yn-1), (xn, yn)] ]

这就是下面代码中12-16行的目的;虽然上面是为了解释方便而进行了一些简化。