旧金山犯罪数据的可视化项目
作者:互联网
参考了高楠同学的帖子,纯粹用来学习的哈。链接如下: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