IDC

关于Python可视化Dash工具—Choropleth_Mapbox地图实现

作者:admin 2021-04-25 我要评论

本文转载自微信公众号「python与大数据分析」,作者一只小小鸟鸟。转载本文请联系python与大数据分析公众号。 有两周没更新公众号,一来是工作有点忙,二来是被...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

本文转载自微信公众号「python与大数据分析」,作者一只小小鸟鸟。转载本文请联系python与大数据分析公众号。

有两周没更新公众号,一来是工作有点忙,二来是被地图的事情搅和的不行了,事情没搞清楚前写文档是对自己最大的不尊重,关于choropleth_mapbox地图实现,有很多坑在里面。主要的因素是对geojson不够了解,以及choropleth_mapbox对参数的解释一直是言之不详。

GeoJSON是一种对各种地理数据结构进行编码的格式,GeoJSON是用json的语法表达和存储地理数据,可以说是json的子集。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。

GeoJSON总是由一个单独的对象组成。这个对象表示几何、特征或者特征集合。

GeoJSON对象可能有任何数目成员。

GeoJSON对象必须有一个名字为"type"的成员。这个成员的值是由GeoJSON对象的类型所确定的字符串。

type成员的值必须是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection"。

以下是个geojosn的样例

  1.   "type""FeatureCollection"
  2.   "features": [ 
  3.         {"type":"Feature"
  4.         "properties":{}, 
  5.         "geometry":{ 
  6.             "type":"Point"
  7.             "coordinates":[105.380859375,31.57853542647338] 
  8.             } 
  9.         } 
  10.     ] 

关于全球地图、中国地图、省域地图的geojson文件均可以下载到,但格式略有区别,比如全球地图有id即国家简写,在properties下的name中也有全称。

但中国地图有adcode,name、级别、中心点等等属性。

在实现choropleth_mapbox的过程中,地图一直无法正常显示,原因有二,其一plotly基于d3.js,geojson文件的加载比较耗时,而且要认为点击一下zoom out按钮才能呈现地图,其二参数不对,在下面的代码注释中已有介绍,在此不做详述了。所有的数据均为随机值,不代表任何含义。

  1. import json 
  2. import pandas as pd 
  3. import plotly.express as px 
  4. def print_json(data): 
  5.     print(json.dumps(data, sort_keys=True, indent=4, separators=(', '': '), ensure_ascii=False)) 
  6.  
  7. with open('countries.geo.json'as response: 
  8.     counties = json.load(response) 
  9. df = pd.read_csv("datarand.csv",encoding="utf-8"
  10.  
  11. # 世界地图,不指定键值,默认采用geojson中的id值,即国家简写,数据表格中的列也要为国家简写,即country列 
  12. fig = px.choropleth_mapbox(df, geojson=counties,locations='country', color='key1'
  13.                            color_continuous_scale=px.colors.diverging.RdYlGn[::-1], 
  14.                            range_color=(100, 10000), 
  15.                            mapbox_style="carto-positron"
  16.                            zoom=1, 
  17.                            center={"lat": 37.4189, "lon": 116.4219}, 
  18.                            opacity=0.5 
  19.                           ) 
  20. fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) 
  21. fig.show() 

  1. # 世界地图,指定properties.name国家名称作为键值,数据表格中的列也要改为国家,即locations列 
  2. fig = px.choropleth_mapbox(df, geojson=counties, featureidkey="properties.name",locations='name', color='key1'
  3.                            color_continuous_scale="Viridis"
  4.                            range_color=(100, 10000), 
  5.                            mapbox_style="carto-positron"
  6.                            zoom=1, 
  7.                            center={"lat": 37.4189, "lon": 116.4219}, 
  8.                            opacity=0.5 
  9.                           ) 
  10. fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) 
  11. fig.show() 

  1. # 世界地图,指定id国家简写作为键值,数据表格中的列也要改为国家简写,即country列 
  2. fig = px.choropleth_mapbox(df, geojson=counties, featureidkey="id",locations='country', color='key1'
  3.                            color_continuous_scale="Reds"
  4.                            range_color=(100, 10000), 
  5.                            mapbox_style="carto-positron"
  6.                            zoom=1, 
  7.                            center={"lat": 37.4189, "lon": 116.4219}, 
  8.                            opacity=0.5 
  9.                           ) 
  10. fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) 
  11. fig.show() 

  1. # 世界地图,不指定键值,默认采用geojson中的id值,即国家简写,数据表格中的列也要为国家简写,即country列,对color_continuous_scale进行设置 
  2. fig = px.choropleth_mapbox(df, geojson=counties, locations='country',  color='key1'
  3.                            range_color=(100, 10000), 
  4.                            color_continuous_scale=[ 
  5.                                [0, 'lightcoral'],  # 这个必须要写,否则会出错 
  6.                                [1. / 3000, 'indianred'], 
  7.                                [1. / 300, 'brown'], 
  8.                                [1. / 30, 'firebrick'], 
  9.                                [1 / 3, 'maroon'], 
  10.                                [1., 'darkred']], 
  11.                            zoom=1, 
  12.                            center={"lat": 37.4189, "lon": 116.4219}, 
  13.                            mapbox_style='carto-positron'
  14.  
  15. fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0}) 
  16. fig.show() 

  1. # 中国地图 
  2. with open('china_geo.json'as response: 
  3.     counties = json.load(response) 
  4.  
  5. df = pd.read_csv("data.csv",encoding="utf-8"
  6.                    dtype={"areacode": str}) 
  7.  
  8. fig = px.choropleth_mapbox(df, geojson=counties, featureidkey="properties.adcode",locations='areacode',  color='confirm'
  9.                            #color_continuous_scale="Viridis"
  10.                            range_color=(1, 80000), 
  11.                            color_continuous_scale=[ 
  12.                                [0, 'lightcoral'],  # 这个必须要写,否则会出错 
  13.                                [1. / 3000, 'indianred'], 
  14.                                [1. / 300, 'brown'], 
  15.                                [1. / 30, 'firebrick'], 
  16.                                [1 / 3, 'maroon'], 
  17.                                [1., 'darkred']], 
  18.                            zoom=3, center={"lat": 37.4189, "lon": 116.4219}, 
  19.                            mapbox_style='carto-positron'
  20.  
  21. fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0}) 
  22. fig.show() 

  1. # 海南地图 
  2. with open('460000-hainan.json'as response: 
  3.     counties = json.load(response) 
  4.  
  5. df = pd.read_csv("hainandata.csv",encoding="utf-8"
  6.                    dtype={"areacode": str}) 
  7.  
  8.  
  9. fig = px.choropleth_mapbox(df, geojson=counties, featureidkey="properties.adcode",locations='areacode',  color='confirm'
  10.                            # color_continuous_scale="Geyser"
  11.                            color_continuous_scale='Reds'
  12.                            #color_continuous_scale=px.colors.diverging.RdYlGn[::-1], 
  13.                            range_color=(1, 1500), 
  14.                            zoom=6, center={"lat": 20.031971, "lon": 110.33119}, 
  15.                            mapbox_style='carto-positron'
  16.  
  17. fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0}) 
  18. fig.show() 


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/V7rtBfqAWd63natJJG_IPQ

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • “礼物”域名12万元领衔!韩国最大比特

    “礼物”域名12万元领衔!韩国最大比特

  • 宋崝:浅谈ICANN的改革与国际化

    宋崝:浅谈ICANN的改革与国际化

  • 亚马逊和谷歌闹掰了:注册系列域名要对

    亚马逊和谷歌闹掰了:注册系列域名要对

  • “场外交易”域名OTC.cn易主大佬戴跃!

    “场外交易”域名OTC.cn易主大佬戴跃!

腾讯云代理商
海外云服务器