其他分享
首页 > 其他分享> > 旧金山犯罪数据的可视化项目

旧金山犯罪数据的可视化项目

作者:互联网

参考了高楠同学的帖子,纯粹用来学习的哈。链接如下:https://www.zhihu.com/question/33783546/answer/775946401
在这里,主要通过folium,实现数据的可视化。这是一个小众库,不过应用起来有些函数,还是得读懂。不得不佩服Python的优势。可视化还有一个很重要的库,即pyecharts,今后将学会运用,其Github上的链接如下:
https://github.com/pyecharts/pyecharts/

这里对这个流程做一下梳理,也是一个复习的过程。
导入库,看下版本,导入是否正常:

import pandas as pd 
import numpy as np
import folium
folium.__version__
#创建世界地图
world_map=folium.Map()
world_map

显示如下图:
世界地图显示
通过经纬度实现地图的载入,此处显示一下深圳地图:

#确定地理位置,以经纬度进行定位。本站所位于旧金山,故以旧金山为准。
latitude=37.77
longitude=-122.42
#显示该位置,zoom_start参数用于缩放大小的控制,tiles用于控制风格,有OpenStreetMap,Stamen Terrain,Stamen Toner等
San_map=folium.Map(location=[latitude,longitude],zoom_start=12)
San_map
#测试一下深圳地图看一下效果
SZ_Latitude=22.54
SZ_Longitude=114.0654 
#SZ_loc=[SZ_Latitude,SZ_Longitude]
SZ_Map=folium.Map(location=[SZ_Latitude,SZ_Longitude],zoom_start=12)
SZ_Map

结果显示如下:
在这里插入图片描述
读取数据并进行显示:

#读取数据
San_data=pd.read_excel('D:/Police_ncidents2016.xlsx')
San_data.head(1)

结果:
在这里插入图片描述
了解到相应的属性数据后,我们通过调用folium的函数进行可视化调置,如下:

#现在可以对前211条数据进行显示了
limit=211
San_data=San_data.iloc[0:limit,:]#利用iloc可对前211项数据进行取值,San_data已更新

#事故区域,DataFrame型
incidents=folium.map.FeatureGroup() 

#将211个事件放进在该区域数组给予显示
for lat,lng, in zip(San_data.Y,San_data.X):
    incidents.add_child
    (
    folium.CircleMarker(
      [lat,lng],
      radius=10,
      color='yellow',
        fill=True,
        fill_color='red',
        fill_opacity=0.4
    )
    )
 #将事故显示在地图上
San_map.add_child(incidents)   

结果是这样的:
在这里插入图片描述
库里对应着地图的函数。整体思路:创建一个事件集群MarkerCluster(),通过add_to(map)将其标记到地图上,然后通过for循坏将每一个 单体事件对象Marker放到Cluster中。

#统计一下相关的信息,用pluggins实现
from folium import plugins
map=folium.Map(location=[latitude,longitude],zoom_start=12)

incidents=plugins.MarkerCluster().add_to(map)  #为数据的事件标记集群对象
type(incidents)

#将数据入入上面的集群对象
for lat,lng,label, in zip(San_data.Y,San_data.X,San_data.Category):
    folium.Marker(
    location=[lat,lng],
    icon=None,
    popup=label,
    ).add_to(incidents)
    
map

伸缩图像会按地图的相应区域大小聚类,自动调节,由Category实现。
在这里插入图片描述
对数据进行统计:

showdata=pd.DataFrame(San_data['PdDistrict'].value_counts())
showdata.reset_index(inplace=True)
showdata.rename(columns={'index':'Neighborhood','PdDistrict':'count'},inplace=True)
showdata

利用网上的边界数据对可视化进行编辑,如下:

#从网上找来的数据,对San市的边界进行可视化。
import json
import requests
url = 'https://cocl.us/sanfran_geojson' #通过URL的方式读取边界文件的尝试
san_geo = f'{url}'
g_map=folium.Map(location=[37.77,-122.4],zoom_start=12) #边界文件作为GeoJson的第一个参数传入,GeoJson还有style_function参数。通过匿名函数给出。

folium.GeoJson(san_geo,style_function=
               lambda feature:{'fillColor':'#ffff00','color':'black','weight':2,'dashArray':'5,5'}).add_to(g_map)

下图就是区域分界结果啦!
在这里插入图片描述
我们希望通过颜色的深浅对犯罪程度做一下直观的显示,这种操作在EXCEL也是常有的(渐变),注意一下颜色参数,其他可以通过查看源代码仔细研究:

#用颜色深浅定义多少,程度,类似于excel
m_color=folium.Map(location=[37.77,-122.74],zoom_start=10)
folium.Choropleth(geo_data=san_geo,
                 data=showdata,
                 columns=['Neighborhood','count'],
                 key_on='feature.properties.DISTRICT',
                 fill_color='YlOrRd',     #注意这里的参数,小写的L与数字0
                  fill_opacity=0.7,
                  line_opacity=0.2,
                  highlight=True,
                  legend_name='Crime Counts in San Fran').add_to(m_color)
m_color

下面就是结果了,犯罪的区域一目了然,是不是很赞?代码也相对简单,可移植。保留着,以后如果有牵涉到经纬度的数据,灵活运用即可。
在这里插入图片描述

标签:map,犯罪,SZ,folium,可视化,Map,data,旧金山,San
来源: https://blog.csdn.net/Hill_L/article/details/98736673