APP下载

地域性统计数据可视化的地图呈现

2022-06-02史文崇

关键词:填色统计数据可视化

史文崇

(河北科技师范学院 数学与信息科技学院,河北 秦皇岛 066004)

在日常工作中,经常会用到数据统计图,如折线图、条形图、圆饼图等,这些统计图不仅显得老套呆板,而且对许多按地域统计的数据来说,也不具有任何地理特征。如果将来自不同地域的数据按其大小、排名、占比等在地图上呈现相应的可视化效果,则显得新颖别致,即使不标注地名,对熟悉地图的受众来说,也有直观的对比效果,或许还能发现数据在地理分布上的规律。

地图呈现的数据可视化与传统的统计图不同,其不便用长度、面积来反映数据特征,而只能通过色彩来表征[1]。目前相应的技术主要有地图汇、数据地图网、TargetMap、GeoCommons 等基于电子地图的网络化应用,需要用户上传数据文件,适用于国家级大规模的综合项目。普通用户要在线下借助电子地图实现地域统计数据可视化并不方便,因为不便从中获得地域分界线上各点的坐标数据——通常只是经纬度,坐标数据还和地图的比例尺有关。笔者分析认为,不妨通过地图图片来实现,只要地图图片精准可靠,长宽尺寸适于受众浏览,人们并不在意其经纬度、比例尺或实际尺寸。只要能够获取地域分界线上各点的坐标并按各地统计数据特点填充其颜色就可以了。

1 问题分析

有了地图图片,在Matlab 中,自动获取地域分界线上各点的坐标并为各地域填色的方法有多种。人们首先会想到通过edge 和find 函数,获得各地轮廓线上各点的坐标,再用plot 函数画出地域轮廓线,最后通过fill 函数为轮廓线内的封闭区域填色。但在实践中发现,这样操作存在以下弊端:

(1)首先需要把总地图(如全省)按地域拆分成若干个子图(如各地市),分别操作,最终汇总,而这项工作通常需要靠人工来完成;

(2)通过edge 和find 函数获取的坐标点(纵横坐标数据)并未按照顺时针或逆时针排序,由于各地轮廓往往外凸、内凹情形兼而有之,plot 函数绘制的地域分界线往往较粗,用fill 函数填色经常造成出界、溢出。即使用inpolygon 函数判断各点是否在地域轮廓线内,仍不能幸免。而要实现内凹多边形上各点坐标按时针排序,则需要一些技巧[2-4];

(3)即使解决了轮廓点按时针排序问题,最终汇总时,多个地域需多次执行轮廓点排序等步骤,严重降低系统的运行速度。

因此,上述思路恐怕不是理想的做法,需要另辟蹊径。其实,Matlab 实现了图像的数学形态学操作,提供了bwlabel 函数,可基于4 连通或8 连通规则定义,对二值图像的连通分量进行标记[5],而后通过label2rgb 函数可将诸多标记按某种色谱(colormap)转变为各点色彩矩阵[6],最后利用imshow 函数显示图像,可有效地免除上述弊端。鉴于地图可视化的本质是各地填充色由其统计数据决定——哪一颜色对应哪一地域,必须严格配对,至此,问题的核心转变为根据各地域统计数据的特点按某种逻辑配置色谱。自定义的色谱矩阵究竟应该有几行数据,相应数据应该位于哪一行,必须事先摸清其规律,否则莫名其妙,亦或张冠李戴,有违初衷。现以河北省(11 个市)地图(如图1 所示)为例(要求各地市有清晰的地域分界线,各地域没有填色,或以较浅的颜色填充)来分析实现。

图1 总地域图原图

2 各地域填色规律

2.1 地图预处理

为便于识别,需要标定各地市的名称,将地图转变为二值图像。首先,用imread 函数读入地图图像到I 矩阵,以网格图显示之;然后,直观地通过网格目测,可得出各地市几何中心的坐标位置(xi,yi),各自对应的地市名称ci可根据实情赋值;最后,通过一个text 函数显示各地市名称,即可完成标定,最好使其水平、垂直居中,例如:text(X,Y,C,'fontsize',9,'HorizontalAlignment','center','VerticalAlignment','middle','color','k'),其中,X、Y为各地市中心横、纵坐标矩阵,C为相应的地市名称字符矩阵(具体数据略)。执行结果如图2 所示。为便于后续处理,还要用im2bw 函数将地图图片转变为二值图像,其等级(level)参数不必人为指定,而用graythresh 函数做出最佳选择[7]。即:p=im2bw(I,graythresh(I))。

图2 标注各地市名称后的地域图

2.2 颜色分布规律分析

用bwlabel 函数标记二值图像p 时,需要判断其连通性,有4 连通和8 连通两种模式[8]。在执行[L,num]=bwlabel(p,n)命令(L为标记矩阵,num 为联通数量,n为4 或8)时,需要从中选一。选择不同模式,得到的联通数或有不同。一般8 连通判定更精准,但也更苛刻,更消耗时间和内存[5]。判定结果还和图片质量(细腻程度)有关。在实际应用中,要确保标记的科学性和实用性,究竟是选择4 连通还是8 连通,关键是看谁更符合实情,更有利于应用。分别用n=4 和n=8 检测获得的连通数量,当采用4 连通时,num=13;而采用8 连通时,num=12。

从图1、2 可知,河北省有11 个地市,外加廊坊一块“飞地”和周边区域,共有13 个封闭区域。初步说明采用4 连通规则获得的连通数与地图中的地市区域数量一致,所以不能使用8 连通定义;但还需进一步判定采用4 连通的连通结果与河北省地图是否完全吻合,于是先采用4 连通规则获取连通标记L,再用label2rgb 函数将相应标记转变为彩色图像。为便于颜色识别和比较,在执行label2rgb 函数时,采用colorcube 色图,各地市分界线颜色采用白色——执行“Ix=imshow(label2rgb(L,colorcube,[1,1,1]))”命令,得到11 地市和周边区域的填色结果,如图3 所示。

图3 总地域图按colorcube 色谱填充后的效果

由图3 可知,在全省地图上既没有出现不封闭的开放区域,也没有多出封闭区域。说明采用4 连通规则处理,完全满足实际需要。

以上测试在执行label2rgb 命令时没有使用颜色顺序(order)参数,系统默认设置,相当于使用“noshuffle”参数,即不打乱指定色谱的颜色顺序,完全按colorcube 颜色序列填充[9]。对应的colorcube 颜色序列如图4 所示[10]。对比图3,不难得出各地市颜色填充顺序规律:总是从左到右,按照各个封闭区域左侧边界出现的顺序进行,对应的顺序号和地市名称如表1 所示。

图4 colorcube 色谱

表1 填充顺序号与对应的地市

只要按可视化工作的需要定义填色矩阵,取代上述colorcube 色谱,即可实现可视化。但要在地图上实现河北省各地市统计数据的可视化,自定义色谱(颜色矩阵)时,必须注意两个问题:一是必须严格遵循这种填色顺序逻辑;二是对廊坊市必须有连续两行完全相同的颜色值。

3 填充色序列矩阵的构建

问题的关键是按照各市的数据情况设置或选择相应的颜色值。为了美观生动,最好用彩色填充,但可视化毕竟不是美术,颜色要有某种(如大小、顺序)暗示,各种色彩也要有明显的视觉差异。理论上说,单色谱系(如绿色,从纯绿到浅绿、淡绿、…)呈现的顺序暗示最好,但当地域稍多(如超过5 个)时,各自颜色深浅差异极小,许多人已难以辨别。这里按人们熟悉的彩虹7 色外加从浅白到近黑的顺序,自定义11 色矩阵,如表2 所示,各地统计数据需和表2 的色谱进行关联才能最终实现可视化。

表2 自定义的11 地域地图色谱

4 可视化的实现

首先,考虑按各市数据排名情况呈现不同色彩,按表2 矩阵输入基础色谱矩阵cs0;待可视化处理的11 个数据(各地市的数据从前到后要按表1 一次输入)可输入或保存到矩阵Dat0 中。然后,通过排序函数sort 可获得排序后的数据序列和各地的排名名次,保存到矩阵rk 中。最后,根据各市的名次,重构相应的显示颜色矩阵。依前所述,代码如下:

%以下循环,根据数据排名获得前9 个地市的实际填充色

至此,按地域统计数据自动生成的色谱cs 已生成,只要将标记L 按cs 色彩序列输出,即可呈现基于各地市统计数据(排名)的可视化结果。即:

排名可视化实质上是将色谱中的各个颜色值设为几个等级,以便明显地看出彼此的差别。要实现各地数据值或数据占比可视化,最简易的做法是使各地的颜色值与数据(值或占比)线性相关,这在理论上完全可行。但有时数据彼此差异极小甚至相等,致使各地颜色差异甚微,最终难辨彼此,有悖于可视化的初衷。不妨在上述排名可视化的基础上,像标注地名那样,再辅助性地标注出相应的统计数字即可。为防止与各地填充颜色接近或相同,可用与之相反的颜色(1-cs)标出。

5 效果验证

根据以上思想,笔者构建了地域统计数据可视化函数datmap(Dt0,Mode),其中,Dt0 为待可视化的数据序列,Mode 为可视化模式编号(1:升序排名可视化,2:降序排名可视化,3:数据降序显示可视化,4:占比降序显示可视化)。只要按表3 从左到右顺序依次给出11 个市的某项统计数据Dt0,根据用户需要的可视化模式调用该函数,就可自动排名、自动计算百分比、自动重现廊坊的数据,基于表2 定义的基础色谱cs0,实现相应的可视化。

表3 待可视化的数据

对于数据项A,有DA=[90,120,78,46,95,150,63,51,39,85,40],以“datmap(DA,1)”命令调用自定义的可视化函数,可得到数据升序排名可视化结果,如图6a 所示。按前面cs0 色谱约定的顺序,可以看出,该项数据的排名顺序是廊坊、秦皇岛、保定、承德、沧州、邢台、…、衡水。而对于数据项B,有DB=[326,351,333,280,78,304,295,81,307,159,90],以“datmap(DB,4)”命令调用之,可得到数据占比可视化结果,如图6b 所示。凭颜色和数据都可以看出,百分比由大到小的顺序是石家庄、邢台、邯郸、廊坊、…、张家口,而且还可以发现,该项数据南部地区普遍较高,而北部地区较低。显然,与传统的统计图相比,这里的可视化效果不仅更加美观、生动、直观,还可以发现数据的地域分布规律。

图6 地域性统计数据可视化的效果

6 结语

河北省下辖11 个地级市,其中廊坊市的飞地特征增加了实现数据可视化的难度。地域统计数据可视化能在河北省实现,在全国或其他省份实现也并不困难。当行政区域(国家、省、市等)下辖的分地域(省、地市、县区等)较少(7 个以下)时,彩虹7 色色谱就足够了。但我国共有30 多个省级行政区,有些行政区的地市数目在20 个以上,当行政区下辖地域较多时,为了呈现更多颜色并暗示色彩顺序规律,可在彩虹7 色加灰黑色谱基础上,将彩虹各个基础色改为2~5 个梯度(如纯红色下再分出较红、浅红、淡红色等),可使基础色谱中的颜色数达到30 个以上,完全可以满足更多地域统计数据可视化的需要。所以这种可视化方案可适用于全国、各省、市级的地域性统计数据可视化。

猜你喜欢

填色统计数据可视化
基于CiteSpace的足三里穴研究可视化分析
创新视角下统计数据的提取与使用
思维可视化
基于CGAL和OpenGL的海底地形三维可视化
填色我最棒
填色我最棒
“融评”:党媒评论的可视化创新
填色我最棒
填色我最棒
国际统计数据