由于最近老鼠屎做的东西和地图上的线型图相关,因此在这里做一点简单总结。很多地方都调试得很不理想,希望成功的地方可以给大家带来一点点启发,不理想的地方也欢迎大神们赐教。
1 Plotly
1.1 地图上绘制线
有关pyplot的相关在老鼠屎的博文使用plotly神器绘制地图(Python版--demo虽易,操作不易,且学且珍惜)中有过简要介绍,这里老鼠屎根据自己的需要写了一个小demo,实战演练了一下,以及实现了给不同线赋以不同数值,通过透明度予以体现。
#引入相关库
import pandas as pd
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected='True')#这里画的对应下图中一个个的点
lonlat = [ dict(type = 'scattergeo',#这个地方可以选择的只有"ISO-3","USA-states"和"country names" locationmode = 'country names',#我这里把这些点放在一个叫location的DataFrame里面,这里是它们的经纬度信息lon = location['lon'],lat = location['lat'],hoverinfo = 'text',text = location['station'],mode = 'markers',marker = dict( size=2, color='rgb(255, 0, 0)',line = dict(width=3,color='rgba(68, 68, 68, 0)')))]#这里标明路径信息,我把路径信息放在一个叫hjnm2的DataFrame里面
subway_paths = []
for i in range( len(hjnm2) ):subway_paths.append(dict(type = 'scattergeo',locationmode = 'country names',lon = [ hjnm2['lon_x'][i], hjnm2['lon_y'][i] ],lat = [ hjnm2['lat_x'][i], hjnm2['lat_y'][i] ],mode = 'lines',line = dict(width = 1,color = 'red',),#这里很有趣,用线的透明度来表示数量的多少opacity = float(hjnm2['nums'][i])/float(hjnm2['nums'].max()),))layout = dict(title = 'XXXXXXXX',showlegend = False, geo = dict(
#设置地图的范围,可以选择的有"world","usa","europe","asia","africa",
#"north america"和"south america"scope='asia',#projection=dict( type='azimuthal equal area' ),showland = True,landcolor = 'rgb(243, 243, 243)',countrycolor = 'rgb(204, 204, 204)',),)fig = dict( data=subway_paths + lonlat, layout=layout )
iplot( fig, filename='d3-flight-paths' )
来看一下效果。由于我的DataFrame比较大,有70000多条数据,使用plotly真的加载不出来。这里先用20000条数据先跑起来看了一下。
由于scope选择的是"asia",而我绘制的区域很小,因而在地图上看着就是一个点,放大后如下图所示。
我的location数据格式大体如下:
hjnm2数据格式如下:
1.2 调用mapbox
关于使用plotly调用mapbox,博主在使用plotly神器绘制地图(Python版--demo虽易,操作不易,且学且珍惜)中也有提到过,这里主要讲一下使用它画线。代码如下:
import plotly.plotly as py
import plotly.graph_objs as go
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected='True')mapbox_access_token = 'XXXXXXXX'data = [go.Scattermapbox(lat=['38.91427','38.91538','38.91458','38.92239','38.93222','38.90842','38.91931','38.93260','38.91368','38.88516','38.921894','38.93206','38.91275'],lon=['-77.02827','-77.02013','-77.03155','-77.04227','-77.02854','-77.02419','-77.02518','-77.03304','-77.04509','-76.99656','-77.042438','-77.02821','-77.01239'],mode='lines',marker=dict(size=9),text=["The coffee bar","Bistro Bohem","Black Cat","Snap","Columbia Heights Coffee","Azi's Cafe","Blind Dog Cafe","Le Caprice","Filter","Peregrine","Tryst","The Coupe","Big Bear Cafe"],)
]layout = go.Layout(autosize=True,hovermode='closest',mapbox=dict(accesstoken=mapbox_access_token,bearing=0,center=dict(lat=38.92,lon=-77.07),pitch=0,zoom=10),
)fig = dict(data=data, layout=layout)
iplot(fig, filename='Multiple Mapbox')
和刚刚的效果相比,调用mapbox在地图的显示上更加细致准确了,然而这种方法是对相连的这些点依次连线,并没有实现start-end这种想要的效果。当然,这里特别强调,这里有可能是博主功力问题没能够实现那种效果,博主欢迎大神赐教,不胜感激!
2 Pyecharts
2.1 安装
pyecharts的安装非常简单,就普通的pip install就可以。对于普通的图表,如bar,line等,安装好后即可制图。然而对于地图,如果仅仅是安装了pyecharts这个库,代码运行后会发现结果并无法显示。这里有个很重要的坑,在pyecharts中需要安装地图相关库才可以,当然安装的方法也是在cmd中pip install即可。安装好后需要重启一下jupyter notebook。
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
pip install echarts-china-counties-pypkg
pip install echarts-china-misc-pypkg
pip install echarts-united-kingdom-pypkg
2.2 使用pyecharts绘制地理坐标系线图
有关使用pyecharts绘制地理坐标系线图,在pyecharts官方文档中有介绍,然而其官方文档的demo是某一已有地点到另一已有地点的连线,这里主要是将地点自定义。
绘制地理坐标系线图,使用GeoLines方法,在其参数geo_cities_coords中传入一个dict,用于自定义地区经纬度,类似如 {'阿城': [126.58, 45.32],} 这样的字典。
from pyecharts import GeoLines, Style#这里先经度后纬度,定义各个点坐标
geo_cities_coords={'三林': [121.5123244, 31.143310800000002],'三林东': [121.5232337, 31.14652508],'三门路': [121.50799520000001, 31.31309147],'上南路': [121.5064128, 31.14911246],'上大路': [121.40917900000001, 31.31352358],'上海体育场': [121.44371310000001, 31.18552163],'上海体育馆': [121.4370549, 31.18272248],'上海儿童医学中心': [121.5239264, 31.20405048]} style = Style(title_top="#fff",title_pos = "center",width=1200,height=600,background_color="#404a59"
)dataline=[["三林","上海儿童医学中心"],["三林东","上海体育馆"],["三门路","上海体育场"],["上南路","上大路"]]geolines = GeoLines("GeoLines 示例", **style.init_style)
geolines.add("", dataline, is_legend_show=False,maptype = '上海',geo_cities_coords=geo_cities_coords)
geolines.render()
geolines
可以看一下效果。
然而使用pyecharts并没有实现不同数值通过线条透明度予以体现的功能,以及自定义的地点如何设置颜色仍在探索,
参考资料:
1.plotly官方文档:https://plot.ly/python/
2.pyecharts官方文档:http://pyecharts.org/#/zh-cn/prepare