120 11 个案例掌握 Python 数据可视化--百度地图的综合应用

百度地图的综合应用

在房产数据分析实验中,我们熟悉了地图的 Map 和 Geo 类,在城市以上层级的绘图上,上述两个类是首选,但是对于县镇、街道等层级的可视化,百度地图是更好的选择,本实验通过出租车、外卖等数据集,对百度地图接口的综合应用做了详细的介绍。

创建百度地图AK

百度地图使用的前提是获得百度授权的 AK,否则地图无法正常可视化。可通过如下方式获得百度 AK :
进入百度控制台,网址 ;
点击我的应用,在弹出的页面点击创建应用;
创建应用的表单中,应用名称可以任意填写,应用类型须填写浏览器端,Referer 表单中填写一个 * , 表示所有网站都可以发起调用,后提交;
提交会自动返回我的应用界面,此时可以发现生成了一条记录,并可以找到刚才申请时填写的应用名称;
鼠标悬停在访问应用(AK)字符串时,字符串右上角会弹出复制,鼠标点击复制,则在剪贴板里获得了百度 AK 的字符串。

如下图所示:


image.png

默认地图样式

!pip install pyecharts==1.7.1

默认情况下,通过 BMap 调用的百度地图与我们手机 APP 看到的样式相同。

from pyecharts.charts import BMap
from pyecharts import options as opts

# 输入百度 AK,字符串形式
# 本实验必须输入百度 AK 否则下文均无法运行
BAIDU_MAP_AK = 

bmap = BMap()
bmap.add_schema(
    baidu_ak=BAIDU_MAP_AK,
    center=[110, 35], # 地图中心经纬度
    zoom=8,  # 缩放等级, 国家级:5,省级:8,市级:10,街道级:12
    is_roam=True,   # 渲染后可滚动鼠标滚轮进行全图缩放
)
bmap.render_notebook()

上海地铁路线分布图

可以在 .add_schema() 接口中传入 map_style 参数进行地图样式的设置,本例设置了主要地理元素的轮廓和填充,并突出显示了上海市地铁线路图。

import matplotlib.colors as cs
map_style = {
    'styleJson': [
        {
            'featureType': 'all',
            'elementType': 'geometry.stroke',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:blue']  # 设置轮廓线为蓝色
            }
        },
        {
            'featureType': 'all',
            'elementType': 'geometry.fill',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:gray']  # 设置填充色为灰色色
            }
        },
        {
            'featureType': 'all',
            'elementType': 'labels',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:gray']  # 所有文字标签设置为和背景相同颜色(不显示)
            }
        },
         {
            'featureType': 'highway',
            'elementType': 'labels',
            'stylers': {
                'visibility': 'off'  # 告诉公路标签不显示
            }
        },
        {
            'featureType': 'subway',
            'elementType': 'geometry',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:red']  # 地铁线条标注为红色
            }
        },
        {
            'featureType': 'subway',
            'elementType': 'labels',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:orange']  # 地铁线标签标注为橘色
            }
        },
    ]
}

bmap = BMap()
bmap.add_schema(
    baidu_ak=BAIDU_MAP_AK,
    center=[121.4648, 31.1891],  # 上海
    zoom=12,
    is_roam=True,
    map_style=map_style,
)
bmap.set_global_opts(
    title_opts=opts.TitleOpts(
        title='上海地铁线分布图',
        title_textstyle_opts=opts.LabelOpts(font_size=25, color='White')
    )
)
bmap.render_notebook()

东方明珠塔附近建筑物分布图

与 Map 和 Geo 相同,可通过 .add_coordinate() 接口可以添加任意点的经纬度和名称进入地图。本例将上海东方明珠塔添加进地图并以散点图的形式显示。在地图样式上,突出显示了建筑物(绿色填充地理块)。

map_style = {
    'styleJson': [
        {
            'featureType': 'water',  # 设置河流
            'elementType': 'geometry',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:blue']
            }
        },
        {
            'featureType': 'building',  # 设置建筑物
            'elementType': 'geometry.fill',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:green']  # 设置填充色为绿色
            }
        },
        {
            'featureType': 'all',
            'elementType': 'labels',
            'stylers': {
                'visibility': 'off'
            }
        },
    ]
}

bmap = BMap()
bmap.add_schema(
    baidu_ak=BAIDU_MAP_AK,
    center=[121.506377, 31.245105],  # 上海东方明珠
    zoom=16,
    is_roam=True,
    map_style=map_style,
)

bmap.add_coordinate('tower', 121.506377, 31.245105)

bmap.add(" ",
         data_pair=[['tower',1]],
         type_="scatter",
         symbol_size=30,
         color=cs.TABLEAU_COLORS['tab:red'],
         label_opts=opts.LabelOpts(is_show=False))

bmap.set_global_opts(
    legend_opts=opts.LegendOpts(is_show=False),
    title_opts=opts.TitleOpts(
        title='东方明珠塔附近建筑物分布图',
        pos_right="1%",
        pos_top="9%",
        title_textstyle_opts=opts.LabelOpts(font_size=25, color='white')
    )
)
bmap.render_notebook()

出租车路线图

数据集介绍:
本实验获取了 88 辆上海出租车的行车数据,数据主要由 3 个特征构成:出租车编号,任一时间点的出租车经度、纬度。每辆出租车的轨迹数据均按时间序列依次排列。

import pandas as pd
df=pd.read_csv('https://labfile.oss.aliyuncs.com/courses/3023/taxi.csv')
df.head()

准备数据

import numpy as np

# 以 CSS4_COLORS 色系标记出租车路线颜色
colors=[value for value in cs.CSS4_COLORS.values()]

# 逐次添加出租车轨迹进入 rountines 列表
rountines=[]
for i,taxi in enumerate(np.unique(df['taxi'])):
    data=df.loc[df['taxi']==taxi]
    taxi_rountines={        
        'coords':[[long,lat] for long,lat in zip(data['long'],data['lat'])],
        'lineStyle':{'normal':{'color':colors[i]}}       
    }
    rountines.append(taxi_rountines)

出租车轨迹图绘制

map_style = {
    'styleJson': [
        {
            'featureType': 'all',
            'elementType': 'geometry.fill',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:gray']
            }
        },
        {
            'featureType': 'all',
            'elementType': 'geometry.stroke',
            'stylers': {
                'color': cs.TABLEAU_COLORS['tab:blue']  # 设置轮廓线为蓝色
            }
        },
        {
            'featureType': 'all',
            'elementType': 'labels',
            'stylers': {
                'visibility': 'off'
            }
        },
    ]
}

b = BMap(init_opts=opts.InitOpts(width='600px', height='900px',))
b.add_schema(
    baidu_ak=BAIDU_MAP_AK,
    center=[121.50, 31.22],
    zoom=12,
    is_roam=True,
    map_style=map_style

)
b.add(
    "",
    type_="lines",
    is_polyline=True,
    data_pair=rountines,
    linestyle_opts=opts.LineStyleOpts(opacity=0.2, width=3),
)
b.set_global_opts(
    legend_opts=opts.LegendOpts(is_show=False),
    title_opts=opts.TitleOpts(
        title='上海部分出租车路线图',
        pos_right="1%",
        pos_top="9%",
        title_textstyle_opts=opts.LabelOpts(font_size=25, color='white')
    )
)
b.render_notebook()

外卖商家评分

数据集介绍:
本数据集来自于数据超市,数据集采集了北京 1000 条商家的外卖相关数据,包括外卖商家,月销售额,评论数,用户平分,外卖商家经纬度坐标等特征。
导入数据并查看前 5 行。

df=pd.read_excel('https://labfile.oss.aliyuncs.com/courses/3023/beijing_waimai.xls')
df.head()

将每个商家的评分数以热力图的形式添加至地图。

b = BMap()
b.add_schema(baidu_ak=BAIDU_MAP_AK,
             zoom=14.5, # 放大倍数到街道层级
             is_roam=True,
             center=[116.327, 39.983] # 大学城附近
             )
for name, long, lat in zip(df['name'], df['lng'], df['lat']):
    b.add_coordinate(name, long, lat)
b.add(" ",
      [[name, score] for name, score in zip(df['name'], df['score'])],
      type_="heatmap",
      point_size=9)
b.set_global_opts(
    title_opts=opts.TitleOpts(
        title='北京大学城外卖商家评分分布',
        pos_top='5%',
        title_textstyle_opts=opts.LabelOpts(font_size=25)
    ),
    visualmap_opts=opts.VisualMapOpts(
        min_=3,
        max_=5,
        range_text=["high", "low"],
        range_color=['green','yellow','red'],
        
    )
)

b.render_notebook()

外卖商家价格

同样的方式,可以获得商家平均价格的热力图分布图。

data=df[['name','lng','lat','avg_price']].copy()

b = BMap()
b.add_schema(baidu_ak=BAIDU_MAP_AK,
             zoom=14,
             is_roam=True,
             center=[116.327, 39.983]
             )
for name, long, lat in zip(data['name'], data['lng'], data['lat']):
    b.add_coordinate(name, long, lat)
b.add(" ",
      [[name, avg_price] for name, avg_price in zip(data['name'], data['avg_price'])],
      type_="heatmap",
      point_size=11)
b.set_global_opts(
    title_opts=opts.TitleOpts(
        title='北京大学城外卖商家平均价格分布',
        pos_top='5%',
        title_textstyle_opts=opts.LabelOpts(font_size=25)
    ),
    visualmap_opts=opts.VisualMapOpts(
        min_=10,
        max_=70,
        range_text=["high", "low"],
        range_color=['green','yellow','red'],
        
    )
)

b.render_notebook()

你可能感兴趣的:(120 11 个案例掌握 Python 数据可视化--百度地图的综合应用)