当前位置: 首页 > 科技观察

Python画图神器,上手直接打开!

时间:2023-03-13 16:19:41 科技观察

大家晚上好。我是小武。之前给大家介绍过各种Python可视化模块,但是用它们做地理可视化是很简单的。那么想要画出更漂亮的视觉图呢?想在地图上自由设置各种参数?想要获得灵活的交互体验?今天就到这里,Python地图绘制神器folium,上手开启!一、folium简介及安装folium建立在Python生态系统的数据应用能力和Leaflet.js库的映射能力之上。在Python中操作数据,然后通过folium在Leaflet地图中可视化。与国内百度的pyecharts相比,folium更加灵活,可以自定义绘图区域,展示形式更加多样。[1]1.Folium简介Folium是一个开源库,它建立在Python生态系统的数据整理能力和Leaflet.js库的映射能力之上。使用Python处理数据并使用Folium在Leaflet地图上将其可视化。Folium可以在交互式Leaflet地图上轻松可视化Python处理的数据。它不仅可以在地图上显示数据的分布,还可以使用Vincent/Vega在地图上进行标记。这个开源库有许多来自OpenStreetMap、MapQuestOpen、MapQuestOpenAerial、Mapbox和Stamen的内置地图元素,并支持使用Mapbox或CloudmadeAPI密钥的自定义地图元素。Folium支持GeoJSON和TopoJSON两种文件格式的叠加。也可以将数据连接到这两种文件格式的叠加层。最后,可以使用color-brewer配色方案创建分布图。Folium允许您使用Python强大的生态系统来处理数据,然后将其与Leaflet地图一起显示。Folium内置了一些来自OpenStreetMap、MapQuestOpen、MapQuestOpenAerial、Mapbox和Stamen的地图元素(tilesets),并支持使用Mapbox或CloudmadeAPI密钥自定义地图元素。Folium支持GeoJSON和TopJSON覆盖,绑定数据以创建等值线图。但是,Folium库在绘制热图时,需要联网才能显示。2.安装foliumpipinstallfolium-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com👆这里直接使用国内豆瓣源。2.基本使用folium显示地图的类是folium.Map,class声明如下:classfolium.Map(location=None,width='100%',height='100%',left='0%',top='0%',position='relative',tiles='OpenStreetMap',attr=None,min_zoom=0,max_zoom=18,zoom_start=10,min_lat=-90,max_lat=90,min_lon=-180,max_lon=180,max_bounds=False,crs='EPSG3857',control_scale=False,prefer_canvas=False,no_touch=False,disable_3d=False,png_enabled=False,zoom_control=True,**kwargs)几个重要的参数:location:纬度andlongitude,listortuple格式,顺序为latitude,longitudezoom_start:缩放值,默认为10,值越大,比例尺越小,地图的缩放级别越大。control_scale:Bool类型,控制是否在地图上添加比例尺,默认为False不添加tiles:显示样式,默认为“OpenStreetMap”,即打开街道显示crs:地理坐标参考系,默认为“EPSG3857”1.各级世界地图importfoliumprint(folium.__version__)#definetheworldmapworld_map=folium.Map()#saveworldmapworld_map.save('test_01.html')结果如下:当前folium版本:0.11。0国家地图importfolium#definethenationalmapnational_map=folium.Map(location=[35.3,100.6],zoom_start=4)#savenationalmapnational_map.save('test_02.html')结果如下:其实改变城市级地图的地图显示就是改变显示的经纬度和缩放比例,保存级别,市级别,县级别使用类似。这里以城市级别为例,比如北京:importfolium#definethenationalmapcity_map=folium.Map(location=[39.93,116.40],zoom_start=10)#savenationalmapcity_map.save('test_03.html')2。在地图上标记常用标记为常用标记添加标记,您可以选择标记的图案importfoliumbj_map=folium.Map(location=[39.93,115.40],zoom_start=12,tiles='StamenTerrain')folium.Marker(location=[39.95,115.33],popup='Mt.HoodMeadows',icon=folium.Icon(icon='cloud')).add_to(bj_map)folium.Marker(location=[39.96,115.32],popup='TimberlineLodge',icon=folium.Icon(color='green')).add_to(bj_map)folium.Marker(location=[39.93,115.34],popup='SomeOtherLocation',icon=folium.Icon(color='red',icon='info-sign')#markcoloricon).add_to(bj_map)bj_map.save('test_04.html')结果如下:添加圆形标记用Circle和CircleMarkerimportfoliumbj_map=folium.Map(location=[39.93,116.40],zoom_start=12,tiles='StamenToner')folium.Circle(radius=200,location=(39.92,116.43),popup='TheWaterfront',color='#00FFFF',#colorfill=False,#fill).add_to(bj_map)folium.CircleMarker(location=(39.93,116.38),radius=50,#圆的半径popup='LaurelhurstPark',color='#FF1493',fill=True,fill_color='#FFD700').add_to(bj_map)bj_map.save('test_05.html')结果为如下:动态展示位置标记importfoliumdynamic_tagging=folium.Map(location=[46.8527,-121.7649]、tiles='StamenTerrain'、zoom_start=13)folium.Marker([46.8354,-121.7325]、popup='CampMuir').add_to(dynamic_tagging)dynamic_tagging.add_child(folium.ClickForMarker(popup='Waypoint'))dynamic_tagging.save('test_06.html')结果如下:更详细的使用请参考官方文档:http://python-visualization.github.io/folium/quickstart.html[2]3.实际案例转换为停车场地理位置数据可视化在地图上的例子,熟悉folium地图可视化的使用1.获取经纬度数据。停车场地理位置数据来源于互联网。数据真实可靠。接下来使用Python爬虫获取数据#数据源:http://219.136.133.163:8000/Pages/Commonpage/login.aspximportrequestsimportcsvimportjsonimportloggingheaders={'X-Requested-With':'XMLHttpRequest','User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/65.0.3325.181Safari/537.36'}logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s:%(message)s')url='http://219.136.133.163:8000/Pages/Commonpage/AsyGetData.asmx/GetParkList's=requests.session()s.get(url,headers=headers)foriinrange(1,318):data={'cp':str(i),'ps':'10','kw':'','lon':'undefined','lat':'undefined','type':'undefined'}url='http://219.136.133.163:8000/Pages/Commonpage/AsyGetData.asmx/GetParkList'#post提交表单数据res=s.post(url,data=data,headers=headers)#重置编码res.encoding='utf-8'#str转json方便提取数据result=json.loads(res.text)['Result']forjinresult:park_name=j['ParkName']Lon=j['经度']Lat=j['纬度']withopen('parkings.csv','a+',换行符='',encoding='gb18030')asf:f_csv=csv.writer(f)f_csv.writerow([park_name,Lon,Lat])logging.info([park_name,Lon,Lat])结果如下:有3170个停车位lotlocationsData2.Folium地图可视化importpandasaspdimportfolium#读取csv数据data=pd.read_csv('parkings.csv',encoding='gbk')#传入经纬度数据park_map=folium.Map(location=[data['latitude'].mean(),data['longitude'].mean()],zoom_start=10,control_scale=True,)#实例化folium.map.FeatureGroup对象incidents=folium.map.FeatureGroup()forname,rowindata.iterrows():incidents.add_child(folium.CircleMarker(#CircleMarker表示花圈(row["latitude"],row["longitude"]),#每个停车场的经纬度坐标radius=7,#circleradiuscolor='#FF1493',#标志外圈颜色fill=True,#是否填充fill_color='#00FF00',#填充颜色fill_opacity=0.4#填充透明度))park_map.add_child(incidents)park_map.save('park_map1.html')效果如下:这个看起来有点乱,我们统计一下每个局部地区的停车场数量park_map=folium.Map(位置=[数据['纬度'].mean(),数据['经度'].mean()],zoom_start=10,control_scale=True,)marker_cluster=plugins.MarkerCluster().add_to(park_map)forname,rowindata.iterrows():folium.Marker(location=[row["latitude"],row["longitude"]]).add_to(marker_cluster)park_map.save('park_map2.html')效果如下:这样就可以在地图上统计每个局部区域的停车场数量。地图不断放大后,还可以显示各个停车场的具体位置,非常方便