!!!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中选择