mapbox+Python实现基于地图交互的交通数据可视化

!!!mapbox做可视化不要钱,不用科学上网,还挺好看

需要调用几个包:
json主要是从绘图的角度,给可视化的点线面确定位置坐标。对于区域来说,也是由json文件给出坐标点,然后定义这些点为边界,用线将点连接起来,形成区域。可以在mapbox中,手动打点,然后导出json文件,这样做的好处是,在数据量没有特别大的时候,所画即所见,不会出现坐标误差在可视化阶段还需要偏移和微调的情况。
plotly主要负责代码层面的效果渲染和交互,包括颜色、粗细、形状等多个参数可进行调整,实现最好的可视化效果。

import json
import plotly as py
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
pyplt = py.offline.plot

数据导入
格式如图
在这里插入图片描述

#point = pd.read_excel(r'zhangjiagang point data.xlsx')
point = pd.read_excel(r'zhangjiagang point data -xiaoshi zhanshi.xlsx')

下面就开始画图啦:

print(point.head())

token='pk.eyJ1Ijoic2hhbGx5ZWxsIiwiYSI6ImNsMzhjazB4cjAwOGQzaW11NnN5b20wOHcifQ.43PFHMZJZYaxPfY09jszA'

fig=px.scatter_mapbox(point,
                                 lon='经度',
                                 lat='纬度',
                                 size='流量',
                                  color='流量',
                                 hover_name='名称',
                                 hover_data=['数据来源'],
                                 size_max=25,
                                 #color_discrete_sequence=px.colors.colorbrewer.Set1
                                 #color_continuous_scale=px.colors.sequential.Viridis

                                #color_continuous_scale=px.colors.sequential.Rainbow
                                color_continuous_scale = px.colors.sequential.Reds

                                 )


fig.update_layout(mapbox={'accesstoken':token,'center':{'lon':120.541768,'lat':31.868239},'zoom':10.3,'style':'outdoors'},
                 title={'text':'张家港拥堵识别','xref':'paper','x':0.5,},
                 margin={'l':10,'r':0,'t':50,'b':10})

pyplt(fig, filename='zhangjiagang point.html')


还有这些可选的配色方案,具体可在plotly的官网上研究,讲道理,好看的不多

#'Blackbody'、'Bluered'、'Blues'、'Cividis'、'Earth'、'Electric'、'Greens'、'Greys'、'Hot'、'Jet'、'Picnic'、'Portland'、'Rainbow'、'RdBu'、'Reds'、'Viridis'、'YlGnBu'、'YlOrRd'

点的大小与流量数据大小正相关,可以设置上限,避免交叉重叠
就是size_max那儿设置

效果图
请添加图片描述

交通小区图同理,需要json文件提供边界 ,excel提供数据
在这里插入图片描述

python包还是那些
自己到前面去import去吧


 #颜色跟着吸引流量数据走,可调整
china_ncp=pd.read_excel('ncp_map.xlsx')
print(china_ncp.head())

 with open(r'zhangjiagang62 smallqv.json',encoding='utf-8')as f:
     china_geo=json.load(f)

 token = 'pk.eyJ1Ijoic2hhbGx5ZWxsIiwiYSI6ImNsMzhjazB4cjAwOGQzaW11NnN5b20wOHcifQ.43PFHMZJZYaxPfY09jszA'
fig = go.Figure(
     go.Choroplethmapbox(geojson=china_geo, locations=china_ncp['FIPS'], z=china_ncp['xiyinliuliang'],
                         name='张家港',
                        hovertext=china_ncp['Provinces'], hoverinfo='text+z', zmax=2000, zmin=0,
                         text=china_ncp['qvneichuxing'],
                         colorscale='YlOrRd', marker_line_width=0.5, marker_line_color='rgb(169,164,159)'))
 fig.update_layout(mapbox={'accesstoken': token, 'center': {'lon': 120.541768, 'lat': 31.868239}, 'zoom': 9.6},
                   title={'text': '张家港交通小区图', 'xref': 'paper', 'x': 0.5},
                    margin={'l': 10, 'r': 0, 't': 50, 'b': 10})
 fig.data[0].hovertemplate = '<b>小区编号</b>: <b>%{hovertext}</b>' + \
                             '<br> <b>吸引流量 </b>: %{z}<br>' + \
                             '<br> <b>区内出行 </b>: %{text}<br>'

 pyplt(fig, filename='map.html')


效果图
请添加图片描述
颜色越深,说明流量越大
zoom用来调整开局地图缩放比例,
你要是一开始想看见全貌,就缩小,
你要是一开始想看见详细的某一条道路,就放大

重要提醒:

编号意识很重要,json文件和交通小区的编号,需要一一对应

mapbox的token 需要自行准备,注册账号,即可获得,本文token仅做示意,为无效token,请谅解

更新-20220607-功能解释


scatter_mapbox(data_frame, lat=None, lon=None, color=None, text=None, 
               hover_name=None, hover_data=None, size=None, 
               animation_frame=None, animation_group=None, 
               category_orders={}, labels={}, color_discrete_sequence=None, 
               color_discrete_map={}, color_continuous_scale=None, 
               range_color=None, color_continuous_midpoint=None, 
               opacity=None, size_max=None, zoom=8, title=None, 
               template=None, width=None, height=None)

data_frame    A 'tidy' pandas.DataFrame

lon           DataFrame中的列名字符串, 数据点的经度

lat           DataFrame中的列名字符串, 数据点的纬度

size          DataFrame中的列名字符串, 把该列的值与数据点的大小相关联

color         DataFrame中的列名字符串, 把该列的值与颜色相关联

title         图表标题

text          DataFrame中的列名字符串, 该列的值在图中显示为文本标签(text labels)
             (静态文本标签)
              
hover_name    DataFrame中的列名字符串, 该列的值在悬停提示框的顶部以粗体显示

hover_data    DataFrame中的列名字符串的列表, 这些列的值在悬停提示框中作为额外的
              数据显示

size_max     使用'size'关键字时数据点的最大尺寸, 整数, 默认为20

zoom         地图缩放的级别, 0-20之间的整数, 默认为8

animation_frame           DataFrame中的列名字符串,  此列中的值用于将标记分配给动画帧

color_continuous_scale    有效的CSS颜色字符串列表, 当color指代的列包含数值型数据时,
                          此列表用于构建连续的color scale, 可以从
                          plotly_express.colors.sequential, 
                          plotly_express.colors.diverging 和
                          plotly_express.colors.cyclical中选择

知乎大佬相关字段整理,不常用的功能敬请移步
https://zhuanlan.zhihu.com/p/159157945
另一个传送门
https://blog.csdn.net/weixin_36115763/article/details/112027723
配色方案 传送门
https://www.bilibili.com/read/cv8291725/

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值