当前位置:   article > 正文

就是这么简单!Pyecharts绘制可视化地图专辑

就是这么简单!pyecharts绘制可视化地图专辑

b0ddbf18894a09645894106eb246dd19.gif

Pyecharts绘制地图如此轻松,几行代码搞定多种形式的数据地图。

Pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。

安装

首先需要安装python第三方包 -- pyecharts, 目前最新版本为1.8.1。

pip install pyecharts

自从 v0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts项目的轻量化运行,pyecharts将不再自带地图 js 文件。如用户需要用到地图图表,可自行安装对应的地图文件包。下面介绍如何安装。

  • 全球国家地图: echarts-countries-pypkg (1.9MB): 世界地图和 213 个国家,包括中国地图

  • 中国省级地图: echarts-china-provinces-pypkg (730KB):23 个省,5 个自治区

  • 中国市级地图: echarts-china-cities-pypkg (3.8MB):370 个中国城市

  • 中国县区级地图: echarts-china-counties-pypkg (4.1MB):2882 个中国县·区

  • 中国区域地图: echarts-china-misc-pypkg (148KB):11 个中国区域地图,比如华南、华北

选择自己需要安装地图相关的扩展包。

  1. pip install echarts-countries-pypkg
  2. pip install echarts-china-provinces-pypkg
  3. pip install echarts-china-cities-pypkg
  4. pip install echarts-china-counties-pypkg
  5. pip install echarts-china-misc-pypkg
  6. pip install echarts-united-kingdom-pypkg

可以选择豆瓣源或清华源加速安装。

  1. pip install pyecharts -i http://pypi.douban.com/simple 
  2. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple echarts-countries-pypkg

pyecharts版本 v0.5.x 和 v1 间不兼容,v1 是一个全新的版本,语法也有很大不同。

查看pyecharts版本。

  1. import pyecharts
  2. print(pyecharts.__version__)

做好准备后,就可以开始绘图了。如果你是新手,对pyehcarts还有些陌生,可以参见官方5分钟上手: https://pyecharts.org/#/zh-cn/quickstart?id=_5-分钟上手

绘制地图

Pyehcarts共有有四种地理图表,

  • Map:地图 (https://pyecharts.org/#/zh-cn/geography_charts?id=map:地图)

    以此为基础,熟悉绘图基本步骤及各个配置项。

  • Geo:地理坐标系 (https://pyecharts.org/#/zh-cn/geography_charts?id=geo:地理坐标系)

    本文重点介绍

  • BMap:百度地图 (https://pyecharts.org/#/zh-cn/geography_charts?id=bmap:百度地图) 百度地图需要申请开发者 AK,(https://lbsyun.baidu.com/)。这里不做细说,大家有兴趣可以去pyecharts官网学习。

  • Map3D:三维地图 (https://pyecharts.org/#/zh-cn/3d_charts?id=map3d-三维地图)

一、Map

以星巴克门店在全球的分布为例。本例数据来源Kaggle星巴克数据:https://www.kaggle.com/starbucks/store-locations

32ca7fe569fea3a490fddefd3c68f7d2.png

也可公众号「数据STUDIO」后台回复【星巴克】获取。

数据样例:

ee4b20b9573d72bd46072cb9124715af.png
  1. from pyecharts.charts import Map
  2. from pyecharts import options as opts
  3. from pyecharts.globals import ThemeType, CurrentConfig
  4. CurrentConfig.ONLINE_HOST = 'C:/python/pyecharts-assets-master/assets/'
  5. # 参考 https://github.com/pyecharts/pyecharts-assets
  6. df = starbuck['English']
  7. data = df.value_counts()
  8. datas = [(i, int(j)) for i, j in zip(data.index, data.values)]
  9. # 实例化一个Map对象
  10. map_ = Map(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))
  11. # 世界地图
  12. map_.add(series_name="门店数量", data_pair=datas, maptype="world")
  13. # 设置系列配置项
  14. map_.set_series_opts(label_opts=opts.LabelOpts(is_show=False))   # 不显示label
  15. # 设置全局配置项
  16. map_.set_global_opts(
  17.      title_opts=opts.TitleOpts(title="星巴克门店数量在全球分布"
  18.                                pos_left='40%'
  19.                                pos_top='10'),   # 调整title位置
  20.      legend_opts=opts.LegendOpts(is_show=False),
  21.      visualmap_opts=opts.VisualMapOpts(
  22.          max_=13608
  23.          min_=1
  24.          is_piecewise=True,
  25.        pieces=[{"max"9"min"1"label""1-9""color""#00FFFF"},
  26.                  {"max"99"min"10"label""10-99""color""#FF69B4"},
  27.                  {"max"499"min"100"label""100-499""color""#0000FF"},
  28.                  {"max"999"min"500"label""500-999""color""#00BFFF"},
  29.                  {"max"2000"min"1000"label""1000-2000""color""#228B22"},
  30.                  {"max"3000"min"2000"label""2000-3000""color""#FF0000"},
  31.                  {"max"20000"min"10000"label"">=10000""color""#FFD700"}
  32.                 ] # 分段  添加图例注释和颜色
  33.      )
  34. )
  35. # 渲染在网页上   有交互性
  36. map_.render('星巴克门店在全球的分布.html')

输出

e5271f34d0e1cddce04c8d4d71b755b9.gif
绘图步骤:
1、创建实例
Map(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))

创建实例并初始化配置。

可配置图表宽度、高度、渲染风格、标题、主题、背景颜色等,详情参见下面连接 https://pyecharts.org/#/zh-cn/global_options?id=initopts:初始化配置项

theme: pyecharts内置提供了10+ 种不同的风格, 参见 https://pyecharts.org/#/zh-cn/themes

2、添加数据

.add()添加了数据。

  • series_name: 系列名称,用于 tooltip 的显示,legend 的图例筛选。

  • data_pair: 数据项,每个数据项由一个个元组组成:(坐标点名称,坐标点值)   实际上一个是地区名称另一个是对应的数据。

    pyecharts绘制地图只需导入城市名称和数值即可,因为区县级以上城市的经纬度信息都已经在模块中存在,可以在 https://github.com/pyecharts/pyecharts/blob/master/pyecharts/datasets/city_coordinates.json中找到。

    本实例中是国家名称与门店数量组成的数据项。

    1. [('United States'13608),
    2.  ('China'2734),
    3.  ('Canada'1468),
    4.  ('Japan'1237),
    5.  ...
    6.  ]
  • **maptype='world'**,这里是指地图类型,默认为china中国。

    地图类型请参见:https://github.com/pyecharts/pyecharts/blob/master/pyecharts/datasets/map_filename.json

3、设置系列配置项
.set_series_opts()

https://pyecharts.org/#/zh-cn/series_options

除了在.add()中设置部分配置项外,就是使用.set_series_opts()配置图元样式、文字样式、标签样式、点线样式等。

4、设置全局配置项

.set_global_opts() 配置标题、动画、坐标轴、图例等。 https://pyecharts.org/#/zh-cn/global_options

b9d8813b7e5e129d6de87d63576a2ef1.png

本实例中:

  • min_: 指定 visualMapPiecewise 组件的最小值。

  • max_: 指定 visualMapPiecewise 组件的最大值。

  • is_piecewise: 是否为分段型。

  • pieces: 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式。

5、生成的地图以html格式保存

.render()将生成的地图以html格式保存。

二、Geo

Geo 图类型,使用type_: str = "scatter" 参数控制。

scatter, effectScatter, heatmap, lines4 种。

  1. from pyecharts.globals import GeoType    
  2. GeoType.GeoType.EFFECT_SCATTER,GeoType.HEATMAP,GeoType.LINES
1、动态涟漪散点图 effectScatter

V1 版本开始支持链式调用,本例数据可「数据STUDIO」后台回复【星巴克】获取。

数据样例:

662c61aceb93d6c79b8cda10ad42dd29.png
  1. import pandas as pd
  2. from pyecharts.globals import ThemeType, CurrentConfig, GeoType
  3. from pyecharts import options as opts
  4. from pyecharts.charts import Geo
  5. CurrentConfig.ONLINE_HOST = 'C:/python/pyecharts-assets-master/assets/'
  6. # pandas读取csv文件数据
  7. df = pd.read_csv('directory2.csv', encoding='utf-8')['城市']
  8. data = df.value_counts()
  9. #自定义各城市的经纬度
  10. # geo_cities_coords = {df.iloc[i]['城市']:[df.iloc[i]['经度'],df.iloc[i]['纬度']] for i in range(len(df))}
  11. datas = [(i, int(j)) for i, j in zip(data.index, data.values)]
  12. print(datas)
  13. geo = (Geo(init_opts=opts.InitOpts(width='1000px'
  14.                                    height='600px'
  15.                                    theme=ThemeType.PURPLE_PASSION),
  16.            is_ignore_nonexistent_coord = True)
  17.        .add_schema(maptype='china'
  18.                    label_opts=opts.LabelOpts(is_show=True))   # 显示label  省名
  19.        .add('门店数量'
  20.             data_pair=datas, 
  21.             type_=GeoType.EFFECT_SCATTER, 
  22.             symbol_size=8,
  23.             # geo_cities_coords=geo_cities_coords
  24.            )
  25.        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  26.        .set_global_opts(
  27.            title_opts=opts.TitleOpts(title='星巴克门店在中国的分布'),
  28.            visualmap_opts=opts.VisualMapOpts(max_=550,
  29.                                              is_piecewise=True,
  30.                                              pieces=[
  31.                      {"max"50"min"0"label""0-50""color""#708090"},
  32.                      {"max"100"min"51"label""51-100""color""#00FFFF"},
  33.                      {"max"200"min"101"label""101-200""color""#FF69B4"},
  34.                      {"max"400"min"201"label""201-400""color""#FFD700"},
  35.                      {"max"800"min"600"label""600-800""color""#FF0000"},])
  36.        )
  37.       )
  38. geo.render("星巴克门店在中国的分布.html")

输出

0da4d6de2010428d9e3cd9bfe43bba1a.gif
Geo新增坐标点
  1. # 新增一个坐标点
  2. .add_coordinate(    
  3.     # 坐标地点名称    
  4.     name: str,     
  5.     # 经度    
  6.     longitude: Numeric,     
  7.     # 纬度    
  8.     latitude: Numeric, )
  9. # 新增 json 文件格式的坐标数据
  10. .add_coordinate_json(
  11.     # json 文件格式的坐标数据
  12.     # 格式如下
  13.     # {
  14.     #   "阿城": [126.5845.32],
  15.     #   "阿克苏": [80.1941.09]
  16.     # }
  17.     json_file: str # 坐标文件路径
  18. )
2、热力图heatmap
  1. from pyecharts import options as opts
  2. from pyecharts.charts import Geo
  3. from pyecharts.globals import ChartType
  4. CurrentConfig.ONLINE_HOST = 'C:/python/pyecharts-assets-master/assets/'
  5. # pandas读取csv文件数据
  6. df = pd.read_csv('directory2.csv', encoding='utf-8')['城市']
  7. data = df.value_counts()
  8. datas = [(i, int(j)) for i, j in zip(data.index, data.values)]
  9. print(datas)
  10. geo = (
  11.     Geo(init_opts=opts.InitOpts(width='1000px'
  12.                                 height='600px'
  13.                                 theme=ThemeType.DARK),
  14.         is_ignore_nonexistent_coord=True)
  15.     .add_schema(maptype="china")                       #maptype选择地图种类
  16.     .add(series_name="门店数量",      # 系列名称
  17.          data_pair=datas,          # 数据项 (坐标点名称,坐标点值)
  18.          blur_size=20,
  19.          symbol_size= 5,
  20.          type_=ChartType.HEATMAP  #类型选为热力图
  21.          )
  22.     .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  23.     .set_global_opts(
  24.         visualmap_opts=opts.VisualMapOpts(max_=800,is_piecewise=True),
  25.         title_opts=opts.TitleOpts(title="星巴克门店在中国的分布热力图"))
  26. )
  27. geo.render( '星巴克门店在中国的分布热力图.html')

输出37c8408798c15954680a182b98b7ca3c.png

3、动态轨迹图lines

pyecharts可以生成地理空间流动图,用来表示航班数量、人口流动等等。

  1. from pyecharts import options as opts
  2. from pyecharts.charts import Geo
  3. from pyecharts.faker import Faker
  4. from pyecharts.globals import ChartType, SymbolType, CurrentConfig
  5. import  random
  6. datas = []
  7. for _ in range(6):
  8.     datas.append(tuple(random.sample(Faker.provinces, 2)))
  9.     
  10. CurrentConfig.ONLINE_HOST = 'C:/python/pyecharts-assets-master/assets/'
  11. geo = (
  12.     Geo(init_opts=opts.InitOpts(width='1000px'
  13.                                 height='600px'
  14.                                 theme=ThemeType.CHALK))
  15.     .add_schema(
  16.         maptype="china",
  17.         itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"),
  18.         label_opts=opts.LabelOpts(is_show=True)
  19.     )
  20.     .add(
  21.         "",
  22.         [list(z) for z in zip(Faker.provinces, Faker.values())],
  23.         type_=ChartType.EFFECT_SCATTER,
  24.         color="white",
  25.     )
  26.     .add(
  27.         "出差",
  28.         data_pair = datas,
  29.         type_=ChartType.LINES,
  30.         effect_opts=opts.EffectOpts(
  31.             symbol=SymbolType.DIAMOND, symbol_size=6, color="blue"
  32.         ),
  33.         linestyle_opts=opts.LineStyleOpts(curve=0.2),
  34.     )
  35.     .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  36.     .set_global_opts(title_opts=opts.TitleOpts(title="动态轨迹图"))
  37.     .render("动态轨迹图.html")
  38. )

输出

7a7278f491a65eb3250de550b4b45395.gif

如果需要再添加一个其他类别的动态轨迹,只需在链式中添加:

  1. .add('旅游',
  2.      [('上海','拉萨'),('拉萨','大理'),('大理','成都'),('成都','海口')],
  3.      type_=ChartType.LINES,
  4.      effect_opts=opts.EffectOpts(
  5.          symbol=SymbolType.ARROW, symbol_size=6, color="orange"),
  6.      linestyle_opts=opts.LineStyleOpts(curve=0.5)
  7.     )

输出如下,可以点击图例来筛选类别。

c0b207bdb0eb3c8890a97bc0779d0d40.gif

这边用到两个配置项:

  • effect_opts= opts.EffectOpts(symbol)涟漪特效配置项

    https://pyecharts.org/#/zh-cn/series_options?id=effectopts:涟漪特效配置项

    symbol: 特效图形的标记。

    ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', diamond', 'pin', 'arrow', 'none'

    可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。

  • linestyle_opts=opts.LineStyleOpts(curve=0.2)线样式配置项

    https://pyecharts.org/#/zh-cn/series_options?id=linestyleopts:线样式配置项

    curve: 线的弯曲度,0 表示完全不弯曲。

4、三维地图

  1. from pyecharts import options as opts
  2. from pyecharts.charts import Map3D
  3. from pyecharts.globals import ChartType
  4. from pyecharts.commons.utils import JsCode
  5. c = (
  6.     Map3D(init_opts=opts.InitOpts(width='1000px'
  7.                                 height='600px'
  8.                                 theme=ThemeType.VINTAGE))
  9.     # 地图类型
  10.     .add_schema(
  11.         itemstyle_opts=opts.ItemStyleOpts( # 图形的颜色
  12.             color="#00BFFF", # 或 'rgb(128, 128, 128)'
  13.             opacity=1, # 图形透明度
  14.             border_width=0.8, # 描边宽度
  15.             border_color="#708090", # 描边颜色
  16.         ),
  17.         # Map3D 的 Label 设置
  18.         map3d_label=opts.Map3DLabelOpts(
  19.             is_show=False,
  20.             formatter=JsCode("function(data){return data.name + " " + data.value[2];}"),
  21.         ),
  22.         
  23.         # 高亮标签配置项
  24.         emphasis_label_opts=opts.LabelOpts(
  25.             is_show=False,
  26.             color="#fff",
  27.             font_size=10,
  28.             background_color="rgba(0,23,11,0)",
  29.         ),
  30.         
  31.         # 光照相关的设置。
  32.         light_opts=opts.Map3DLightOpts(
  33.             main_color="#fff",
  34.             main_intensity=1.2,
  35.             main_shadow_quality="high",
  36.             is_main_shadow=False,
  37.             main_beta=10,
  38.             ambient_intensity=0.3,
  39.         ),
  40.     )
  41.     .add(
  42.         series_name="门店数量",
  43.         data_pair=datas,
  44.         # 叠加图的类型
  45.         type_=ChartType.BAR3D,
  46.         bar_size=1,
  47.         
  48.         # 三维地图中三维图形的着色效果。
  49.         shading="lambert",
  50.         label_opts=opts.LabelOpts(
  51.             is_show=False,
  52.             formatter=JsCode("function(data){return data.name + ' ' + data.value[2];}"),
  53.         ),
  54.     )
  55.     .set_global_opts(title_opts=opts.TitleOpts(title="星巴克门店在中国的分布3D图"))
  56.     .render("map3d_with_bar3d.html")
  57. )

输出

07a8f5337436dbce46e28a5d91f13730.gif

本例中的主要参数说明:

.add_schema()

地图类型设置,参考pyecharts.datasets.map_filenames.json 文件

  • itemstyle_opts=opts.ItemStyleOpts( ) 图形的颜色

  • map3d_label=opts.Map3DLabelOpts() Map3D 的 Label 设置

  • emphasis_label_opts=opts.LabelOpts() 高亮标签配置项参考 series_options.LabelOpts

  • light_opts=opts.Map3DLightOpts() 光照相关的设置。在 shading 为 'color' 的时候无效。

.add()
  • type_=ChartType.BAR3D, 叠加图的类型(目前只支持Bar3D,Line3D,Lines3D,Scatter3D

  • shading="lambert"

    三维地图中三维图形的着色效果。ECharts GL 中使用了基于物理的渲染(PBR)来表现真实感材质。echarts-gl 中支持下面三种着色方式:color: 只显示颜色,不受光照等其它因素的影响。lambert: 通过经典的 lambert 着色表现光照带来的明暗。realistic: 真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。

5、Globe地图

数据来源是pyecharts自带的全球人口数据。

  1. import pyecharts.options as opts
  2. from pyecharts.charts import MapGlobe
  3. from pyecharts.faker import POPULATION
  4. from pyecharts.globals import ThemeType
  5. data = [x for _, x in POPULATION[1:]]
  6. low, high = min(data), max(data)
  7. c = (
  8.     MapGlobe(init_opts=opts.InitOpts(theme=ThemeType.DARK))
  9.     .add_schema()
  10.     .add(
  11.         maptype="world",
  12.         series_name="World Population",
  13.         data_pair=POPULATION[1:],
  14.         is_map_symbol_show=False,
  15.         label_opts=opts.LabelOpts(is_show=False),
  16.     )
  17.     .set_global_opts(
  18.         visualmap_opts=opts.VisualMapOpts(
  19.             min_=low,
  20.             max_=high,
  21.             range_text=["max""min"],
  22.             is_calculable=True,
  23.             range_color=["lightskyblue""yellow""orangered"],
  24.         )
  25.     )
  26.     .render("map_globe_base.html")
  27. )

输出8779c7021ca067d47c630f8396c867d3.gif

本文到此结束,总体来说Pyecharts地图绘图还是比较友好,在不需要多么炫酷的配置前提下,只需要将输入数据格式和类型弄清楚,其余默认配置即可。

对地图样式有一定要求时,只需要根据官网上的配置信息调整全局配置项和系列配置项即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/975688
推荐阅读
相关标签
  

闽ICP备14008679号