毕设炼丹已经很心累了,系里还强行要求论文也得弄个3~5min视频解说,手动尼克杨问号脸???反正现在视频怎么做还没思路,就先把纽约市的犯罪风险预测结果做个可视化吧。
技术路线
数据科学领域……不用Python是不可能的,这辈子都不可能不用python的,Basemap嫌太丑,Echarts又不会,Plotly还要注册,就只能靠geoplotlib勉强混混日子这样子。
前期准备
三个文件:2015年纽约犯罪风险等级预测结果risk4visualization.csv
(毕设结果),纽约人口普查区域编号和实际社区编号的映射文件cd2puma.json
(手动编写的), 纽约社区边界文件Community_Districts.geojson
(点此下载)。
![纽约人口普查区域编号与实际社区编号不同](/2018/06/05/纽约犯罪风险预测结果可视化/puma_cd_no_differs.png)
绘制风险图
设置颜色级别, 风险等级分为0~5级,共六个级别:
1 | cmap = ColorMap('Reds', alpha=255, levels=6) |
获取颜色,这个函数在绘制每个区域时都会被调用,根据index
来查找对应的风险等级,再转化为颜色。这里用的to_color()
其实是用于连续值映射的,后来翻阅文档时发现了对应于离散值映射的函数create_set_cmap
and colorbrewer
,效果应该没差多少也就懒得改了。
1 | def get_color(properties): |
绘制函数,考虑到区域内部用了红色,边界用暖色调会和谐一点,这里选用镉黄色,rgb(255, 153, 18)(颜色表参考):
1 | def draw_riskmap(filename): |
geoplotlib库还不支持添加图例和文字说明,这里迂回了一下,派生了一个TextLayer类,重写了draw()方法,使用ui_manager
在图右上角添加时间信息。
1 | class TextLayer(BaseLayer): |
main()中绘制从2015年12月1日0点至2015年12月2日23点,共48h的风险图。
1 | dates = [datetime(2015, 12, 1), datetime(2015, 12, 2)] |
制作动图
将上述获得的48张图片导入PS中,在时间轴中添加帧动画制作GIF。结果如下:
![纽约48h犯罪风险变化情况](/2018/06/05/纽约犯罪风险预测结果可视化/nyc-crime-risk.gif)
geoplotlib使用体验
在CartoDB Positron提供的背景地图支持下,geoplotlib绘制的图显得精致了不少(当然不能和Echarts这种大杀器相提并论),不过文档和示例还有所欠缺,很多API仅仅靠reference没办法搞清楚用法,只能通过查看源码实现自行领会,或者查看github issue来拾点牙慧。
参考资料
User Guide https://github.com/andrea-cuttone/geoplotlib/wiki/User-Guide
Andrea Cuttone,Sune Lehmann,Jakob Eg Larsen Geoplotlib: a Python Toolbox for Visualizing Geographical Data https://arxiv.org/abs/1608.01933