老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图

    由于最近老鼠屎做的东西和地图上的线型图相关,因此在这里做一点简单总结。很多地方都调试得很不理想,希望成功的地方可以给大家带来一点点启发,不理想的地方也欢迎大神们赐教。

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条数据先跑起来看了一下。

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图_第1张图片

     由于scope选择的是"asia",而我绘制的区域很小,因而在地图上看着就是一个点,放大后如下图所示。

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图_第2张图片

     我的location数据格式大体如下:

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图_第3张图片

    hjnm2数据格式如下:

 老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图_第4张图片

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这种想要的效果。当然,这里特别强调,这里有可能是博主功力问题没能够实现那种效果,博主欢迎大神赐教,不胜感激!

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图_第5张图片

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

    可以看一下效果。 

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图_第6张图片

    然而使用pyecharts并没有实现不同数值通过线条透明度予以体现的功能,以及自定义的地点如何设置颜色仍在探索, 

参考资料:

1.plotly官方文档:https://plot.ly/python/

2.pyecharts官方文档:http://pyecharts.org/#/zh-cn/prepare

你可能感兴趣的:(可视化,python,地理信息可视化)