由于最近老鼠屎做的东西和地图上的线型图相关,因此在这里做一点简单总结。很多地方都调试得很不理想,希望成功的地方可以给大家带来一点点启发,不理想的地方也欢迎大神们赐教。
有关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数据格式如下:
关于使用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这种想要的效果。当然,这里特别强调,这里有可能是博主功力问题没能够实现那种效果,博主欢迎大神赐教,不胜感激!
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
有关使用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