国庆节前夕,上海市统计局综合数据平台青年突击队GIS小组召开了一场趣味讲座,交流分享了利用Excel制作数据热力地图(HeatMap)的方法和思路。
想知道怎样从0开始创建一张数据热力地图吗?还等什么,搬起小板凳,跟我们一起来看看吧。
在没有模板的情况下,首次尝试创建一张数据热力地图大概需要1个小时左右。当模板创建完成后,生成一张数据热力地图就是分分钟的事情啦。
先来看看我们需要准备的材料。首先,我们需要一个用来创作热力地图的软件,这里就选用我们工作生活中常用的Excel。然后,创建数据地图必不可少的就是“数据”和“地图”了。
这里的数据要求是分地区的数据,这样创作出来的地图才会有颜色的差异;而地图需要能够将区划区分出来,这样我们才能知道每个地区的边界在哪里。如果没有现成的分地区矢量地图怎么办呢?非常简单,我们就自己动手做一个。可以利用搜索引擎直接搜索区划名称找到相应的图片,选择其中较为简洁清晰的图片作为底图。
再借助Excel提供的“任意多边形”形状工具,将视图放大到合适的倍数后沿底图边线进行勾勒。
勾勒完成后,在左上角的名称框中为形状命名,方便进行后续操作。
待全部区划勾勒完毕后,玩一个拼图游戏,把这些形状拼接在一起,对拼接不整齐的地方放大后进行微调。最后将这些形状组合在一起就大功告成了。
有了地图,剩下要做的事情就是把数据加载到地图上了。比如我们要用数据热力地图体现地区间的增速和总量差异,分别用颜色和高度来表示。那么我们首先将数据列出来,每个独立形状对应一行数据【比如崇明三岛就要对应三条数据】。
利用公式计算出数据的最大值【例:B21=MAX(B2:B19)】和最小值【例:B22=MIN(B2:B19)】(如果希望数据热力指示范围从指定数值开始,也可以直接指定最小值,比如将最小值直接设置为0)。给出希望分档的数量,计算得到分档间隔【例:B24=ROUND((B21-B22)/B23,0)】。如果数据较大,为保证显示效果,需要对数据进行标准化处理【例:E2=D2/D$21*100】。
接下来,我们要为数据设置对应的颜色。首先,列出每档数据的最小值【例:A27=A26+B$24】和对应的颜色名称;然后,选择最低档位和最高档位对应的颜色。我们需要知道颜色的RGB数值来确定中间档位的颜色。你可以右键点击单元格查看该单元格填充色的RGB数值,再手动填写进去;也可以编写一小段宏代码,今后替换颜色就更方便了(编写宏代码可以通过开发控件菜单插入表单控件按钮,在弹出的“指定宏”窗口新建宏,也可以直接用Alt+F11呼出VBA窗口进行编辑)。
Sub 图例填色()
R1 = Cells(26, 4).Interior.Color Mod 256
G1 = Cells(26, 4).Interior.Color / 256 Mod 256
B1 = Cells(26, 4).Interior.Color / 256 / 256 Mod 256
R2 = Cells(31, 4).Interior.Color Mod 256
G2 = Cells(31, 4).Interior.Color / 256 Mod 256
B2 = Cells(31, 4).Interior.Color / 256 / 256 Mod 256
Cells(26, 5) = R1
Cells(26, 6) = G1
Cells(26, 7) = B1
Cells(31, 5) = R2
Cells(31, 6) = G2
Cells(31, 7) = B2
For i = 27 To 30
For j = 5 To 7
If Cells(26, j) > Cells(31, j) Then
Cells(i, j) = Cells(26, j) - (Cells(26, j) - Cells(31, j)) / (Cells(24, 2) - 1) * (i - 26)
Else
Cells(i, j) = Cells(31, j) - (Cells(31, j) - Cells(26, j)) / (Cells(24, 2) - 1) * (31 - i)
End If
Next
Cells(i, 4).Interior.Color = RGB(Cells(i, 5), Cells(i, 6), Cells(i, 7))
Next
End Sub
上述代码中,R1\G1\B1三个变量分别获取最低档位颜色的RGB近似数值,R2\G2\B2则分别获取最高档位颜色的RGB近似数值。然后将这些数值分别写入(E26:G26)区域和(E31:G31)区域。
接着,我们利用一个嵌套循环,计算得出中间过渡色的RGB数值,填入(E27:G30)区域并根据每行对应的RGB数值将颜色填入(D27:D30)区域。
颜色填充完毕后,还需要为每个颜色单元格在左上角的名称框中命名,方便我们进行后续操作。
然后,使用Vlookup函数为每块区域找到对应的颜色【例:C2=VLOOKUP(B2,$A$26:$B$31,2)】。
至此,所有的准备工作已经做好,接下来只要把颜色给到对应的区域就大功告成了。
为此,我们可以再设置一个名为图形填色的按钮,新建宏代码,为每个形状填充对应的颜色:
Sub 图形填色()
For i = 2 To 19
ActiveSheet.Shapes(Range("A" & i).Value).Fill.ForeColor.RGB = Range(Range("C" & i).Value).Interior.Color
Next
End Sub
图例可以将颜色和数字范围单元格复制后,以“链接的图片”格式粘贴到地图旁边,并与地图组合在一起。这样,当分档数值范围或配色方案改变后,图例也会自动更新。
颜色设置好后,我们再根据E列标准化后的数据为形状设置高度,代码如下:
Sub 设置高度()
For i = 2 To 19
ActiveSheet.Shapes(Range("A" & i).Value).Select
With Selection.ShapeRange.ThreeD
.Depth = Range("E" & i).Value
.Z = Range("E" & i).Value
.ExtrusionColor.ObjectThemeColor = msoThemeColorBackground1
.ExtrusionColor.TintAndShade = 0
End With
Next
End Sub
其中,Depth 属性为形状的深度,Z属性为形状在Z轴上的坐标,当Depth与Z的取值相等时,表现在图形上就是形状突出的高度了。ExtrusionColor相关的属性设置是为图形突出后的侧面设置颜色和阴影处理方式。
点击设置高度按钮后……嗯?图形没有变化?!这是因为我们现在是完全的俯视视角,需要在设置图片格式中对图形进行3D旋转,就能看到3D效果了。
至此,我们的数据热力地图就算创建完毕了。(完结撒花~)
数据热力地图与GIS的共同点在于,二者都是将数据与地图相结合的一种数据可视化表现形式。不同点在于,GIS并不是根据数据直接在地图上填色,而是以地图作为底图,将数据按照坐标点加载上去,再根据需要进行加工。还需要考虑地址文本识别、坐标转换和动态数据库链接等问题。从基础的绘制热力地图开始慢慢接近GIS的终极奥义,在学习这件事上,我们突击队成员们都是很认真的!
当班小编:宋玉
总有人正年轻着
○
沪小统
○
上海统计青年的心灵港湾
做一个有态度、有温度的公众号
领取专属 10元无门槛券
私享最新 技术干货