纽约犯罪风险预测结果可视化

毕设炼丹已经很心累了,系里还强行要求论文也得弄个3~5min视频解说,手动尼克杨问号脸???反正现在视频怎么做还没思路,就先把纽约市的犯罪风险预测结果做个可视化吧。

技术路线

数据科学领域……不用Python是不可能的,这辈子都不可能不用python的,Basemap嫌太丑,Echarts又不会,Plotly还要注册,就只能靠geoplotlib勉强混混日子这样子。

前期准备

三个文件:2015年纽约犯罪风险等级预测结果risk4visualization.csv(毕设结果),纽约人口普查区域编号和实际社区编号的映射文件cd2puma.json(手动编写的), 纽约社区边界文件Community_Districts.geojson点此下载)。

绘制风险图

设置颜色级别, 风险等级分为0~5级,共六个级别:

1
cmap = ColorMap('Reds', alpha=255, levels=6)

获取颜色,这个函数在绘制每个区域时都会被调用,根据index来查找对应的风险等级,再转化为颜色。这里用的to_color()其实是用于连续值映射的,后来翻阅文档时发现了对应于离散值映射的函数create_set_cmap and colorbrewer,效果应该没差多少也就懒得改了。

1
2
3
4
5
6
7
8
9
def get_color(properties):
key = properties['boro_cd']
demogra_no = cd2puma.get(key)

if demogra_no is None:
return [0, 0, 0, 0]

index = ((recorddate - datetime(2015, 1, 1)).days * 24 + hour) * 55 + pumalist.index(demogra_no)
return cmap.to_color(riskLevel.ix[index, '0.0'], 5, 'lin')

绘制函数,考虑到区域内部用了红色,边界用暖色调会和谐一点,这里选用镉黄色,rgb(255, 153, 18)(颜色表参考):

1
2
3
4
5
6
7
def draw_riskmap(filename):
geoplotlib.set_window_size(800, 600)
geoplotlib.geojson('data/Community_Districts.geojson', fill=True, color=get_color)
geoplotlib.geojson('data/Community_Districts.geojson', color=[255, 153, 18, 100])
geoplotlib.set_smoothing(True)
geoplotlib.set_bbox(BoundingBox)
geoplotlib.savefig('imgs/'+ filename)

geoplotlib库还不支持添加图例和文字说明,这里迂回了一下,派生了一个TextLayer类,重写了draw()方法,使用ui_manager在图右上角添加时间信息。

1
2
3
4
5
6
class TextLayer(BaseLayer):

def draw(self, proj, mouse_x, mouse_y, ui_manager):
datestr = recorddate.strftime('%Y-%m-%d ')
hourstr = str(hour) + ":00"
ui_manager.info(datestr + hourstr)

main()中绘制从2015年12月1日0点至2015年12月2日23点,共48h的风险图。

1
2
3
4
5
6
7
dates = [datetime(2015, 12, 1), datetime(2015, 12, 2)]

for recorddate in dates:
for hour in range(24):
filename = str((recorddate - dates[0]).days * 24 + hour)
geoplotlib.add_layer(TextLayer())
draw_riskmap(filename)

制作动图

将上述获得的48张图片导入PS中,在时间轴中添加帧动画制作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

0%