首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小统手把手教你从0开始创建数据热力地图!

国庆节前夕,上海市统计局综合数据平台青年突击队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的终极奥义,在学习这件事上,我们突击队成员们都是很认真的!

当班小编:宋玉

总有人正年轻着

沪小统

上海统计青年的心灵港湾

做一个有态度、有温度的公众号

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181010G0C98500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券