当前位置:主页 > 查看内容

图样图森破-pyecharts之地图

发布时间:2021-04-08 00:00| 位朋友查看

简介:在之前南丁格尔玫瑰图的介绍中,我们把各个国家的疫情数据以玫瑰图的形式进行了展示,但是当涉及到的国家数量较多时,玫瑰图也并不能完美地展示出所有国家。这个时候,我们很自然地就想到了在世界地图上表示表示各个国家的,那么在pyecharts中如何实现呢? py……

在之前南丁格尔玫瑰图的介绍中,我们把各个国家的疫情数据以玫瑰图的形式进行了展示,但是当涉及到的国家数量较多时,玫瑰图也并不能完美地展示出所有国家。这个时候,我们很自然地就想到了在世界地图上表示表示各个国家的,那么在pyecharts中如何实现呢?

pyecharts支持Map(地图)、Geo(地理坐标)、Map3D(三维地图)、BMap(百度地图)多种地图组件。

仍以疫情数据为例,不过这次我们选用国内各省级行政单位的数据。这是因为在pyecharts的世界地图中,是使用国家或地区的英文名称来匹配的,而我们获取到的疫情数据则都是中文名称,而中国地图上是使用中文名称来匹配各行政区域的。为免中文名称转换英文名称的麻烦,因此我们本次使用国内的数据来做示范。

数据如上所示,下面我们按部就班地开始地图的各项设置:

  1. from pyecharts import charts, options 
  2. from pyecharts.commons.utils import JsCode 
  3. import pandas as pd 
  4.  
  5. data = pd.read_excel('国内疫情数据.xlsx'
  6. map1 = charts.Map(init_opts=options.InitOpts(width='1200px', height='800px')) 

与往常一样,在初始化配置中我们设置绘图区域的宽和高。接下来是数据项和地图的配置:

  1. map1.add('累计',         data_pair=[(x[1]['地区'], x[1]['累计']) for x in data.iterrows()],         maptype='china',         is_selected=True,         is_roam=True,         aspect_scale=0.75,         selected_mode='multiple',         label_opts=options.LabelOpts(is_show=True,                                      formatter=JsCode('''function(params){                                        if (params['value']){return params['name'] + ':' + params['value']}                                        else{return ''}                                        }''')),         is_map_symbol_show=False         ) 

首先,add接受的第一个参数仍然是数据系列名称,但与一般图表不同但是,Map中对多个数据系列不能同时显示,当你选中的多个系列在同一区域都有值的话,那么就会对其进行求和或平均值、最大值、最小值之一来进行图表展示。

(1) data_pair参数接收的参数为二元数组,第一个元素为区域名称,第二个为区域值

(3)maptype是指地图类型,世界地图为“world”,中国地图则为“china”,如果是国内各省级行政单位,则是“山东”、“北京”、“广东”等

(4)is_selected表示当前数据系列是否默认选中

(5)is_roam为bool值,为True时可以使用鼠标拖拽缩放和移动地图位置

(6)aspect_scale表示地图的长宽比

(7)selected_mode表示是否支持选中多个区域,取值可以是bool型(True、False)和str型(single、multiple)

(8)label_opts是标签项,是指的地图上各区域的名称及其数值等说明,其中formatter参数我们使用Js传入,是为了使地图各区域只有当被传入了数值且值不为0时才会显示标签;如上图中把西藏地区空置,其标签就不再显示

(9)is_map_symbol_show用来控制地图各区域上是否显示标记,如果为True则会在该区域有一个小红点,一般是在其省会城市的位置

  1. map1.set_global_opts( 
  2.     visualmap_opts=options.VisualMapOpts( 
  3.             type_='color'
  4.                   is_show=True
  5.                   pos_bottom='50%'
  6.                   pos_left='0%'
  7.                   min_=min(data['累计']), 
  8.                   max_=max(data['累计']), 
  9.                   is_piecewise=True
  10.                   pieces=[ 
  11.                       {'min'min(data['累计']), 'max': 200}, 
  12.                       {'min': 201, 'max': 300}, 
  13.                       {'min': 301, 'max': 400}, 
  14.                       {'min': 401, 'max': 500}, 
  15.                       {'min': 501, 'max': 600}, 
  16.                       {'min': 601, 'max': 700}, 
  17.                       {'min': 701, 'max': 800}, 
  18.                       {'min': 801, 'max': 900}, 
  19.                       {'min': 901, 'max': 1000}, 
  20.                       {'min': 1000, 'max': 10000}, 
  21.                       {'value': 68151, 'label''湖北''color''red'}, 
  22.                       {'value': 10884, 'label''香港''color''red'
  23.                   ])) 

对于地图,普遍地是以颜色表示数值大小。Map中在全局配置项中有一个视觉地图的配置项,指定数值最小和最大(min_和max_),即可以颜色表示此区间数值大小。其中is_piecewise表示是否分段,如果为True则像下图一样,按照pieces中设置的区间即对应颜色分段显示图例,通过点击图例即可选中对应颜色的区域并高亮显示:

如果为False,效果则如下图:图例为一条连续色卡,通过鼠标滑动,可以选择对应颜色的区域,但由于无法指定分段区间及颜色,当离差较大时,就会出现颜色单一,无法达到渐变的效果。

Map3D可以绘制三维地图,效果如下:

 

以每个区域上柱子的长短表示数值大小,直观且立体。现将代码附上,参数含义不再赘述:

  1. map2 = charts.Map3D(init_opts=options.InitOpts(width='1200px', height='800px')) 
  2. location = [('121.509062''25.044332''台湾'), 
  3.             ('114.502461''38.045474''河北'), 
  4.             ('112.549248''37.857014''山西'), 
  5.             ('111.670801''40.818311''内蒙古'), 
  6.             ('123.429096''41.796767''辽宁'), 
  7.             ('125.3245''43.886841''吉林'), 
  8.             ('126.642464''45.756967''黑龙江'), 
  9.             ('118.767413''32.041544''江苏'), 
  10.             ('120.153576''30.287459''浙江'), 
  11.             ('117.283042''31.86119''安徽'), 
  12.             ('119.306239''26.075302''福建'), 
  13.             ('115.892151''28.676493''江西'), 
  14.             ('117.000923''36.675807''山东'), 
  15.             ('113.665412''34.757975''河南'), 
  16.             ('114.298572''30.584355''湖北'), 
  17.             ('112.982279''28.19409''湖南'), 
  18.             ('113.280637''23.125178''广东'), 
  19.             ('108.320004''22.82402''广西'), 
  20.             ('110.33119''20.031971''海南'), 
  21.             ('104.065735''30.659462''四川'), 
  22.             ('106.713478''26.578343''贵州'), 
  23.             ('102.712251''25.040609''云南'), 
  24.             ('91.132212''29.660361''西藏'), 
  25.             ('108.948024''34.263161''陕西'), 
  26.             ('103.823557''36.058039''甘肃'), 
  27.             ('101.778916''36.623178''青海'), 
  28.             ('106.278179''38.46637''宁夏'), 
  29.             ('87.617733''43.792818''新疆'), 
  30.             ('116.405285''39.904989''北京'), 
  31.             ('117.190182''39.125596''天津'), 
  32.             ('121.472644''31.231706''上海'), 
  33.             ('106.504962''29.533155''重庆'), 
  34.             ('114.173355''22.320048''香港'), 
  35.             ('113.54909''22.198951''澳门')] 
  36. location_dict = {x[-1]: [x[0], x[1]] for x in location} 
  37. map2.add_schema( 
  38.     itemstyle_opts=options.ItemStyleOpts( 
  39.         color="rgb(5,101,123)"
  40.         opacity=1, 
  41.         border_width=0.8, 
  42.         border_color="rgb(62,215,213)"
  43.     ), 
  44.     map3d_label=options.Map3DLabelOpts( 
  45.         is_show=False
  46.         formatter=JsCode("function(data){return data.name + " " + data.value[2];}"), 
  47.     ), 
  48.     emphasis_label_opts=options.LabelOpts( 
  49.         is_show=False
  50.         color="#fff"
  51.         font_size=10, 
  52.         background_color="rgba(0,23,11,0)"
  53.     ), 
  54.     light_opts=options.Map3DLightOpts( 
  55.         main_color="#fff"
  56.         main_intensity=1.2, 
  57.         main_shadow_quality="high"
  58.         is_main_shadow=False
  59.         main_beta=10, 
  60.         ambient_intensity=0.3, 
  61.     ), 
  62. ).add
  63.     series_name="bar3D"
  64.     data_pair=[(x[1]['地区'], (location_dict[x[1]['地区']][0], location_dict[x[1]['地区']][1], x[1]['现有'])) for x in 
  65.                data.iterrows()], 
  66.     type_=ChartType.BAR3D, 
  67.     maptype='china'
  68.     bar_size=1, 
  69.     shading="lambert"
  70.     label_opts=options.LabelOpts( 
  71.         is_show=False
  72.         formatter=JsCode("function(data){return data.name + ' ' + data.value[2];}"), 
  73.     ), 
  74. ).set_global_opts(title_opts=options.TitleOpts(title="Map3D-Bar3D")) 
  75.  
  76. page = charts.Page() 
  77. page.add(map1).add(map2) 
  78. page.render('map.html'


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/XdeaIqofEaztYJTamqXHOA
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐