综合案例-数据可视化-地图

发布于:2024-09-18 ⋅ 阅读:(38) ⋅ 点赞:(0)

一、pyecharts—地图快速入门

假设我们要将6个地区的某种数量在地图上标注出来,首先导入pyecharts包内地图相关模块,然后准备地图数据(数据类型是列表,列表的元素类型为元组),然后把准备好的数据添加进地图。补充细节,设置全局选项,不同的数量段用不同颜色标注出来,使效果更加直观。最后,生成地图。

代码示例:

#导包
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
#构建地图
map=Map()
#准备地图数据
data=[           #数据类型:元素类型为元组的列表
    ('北京市',99),
    ('上海市',199),
    ('湖南省',299),
    ('山东省',199),
    ('安徽省',499),
    ('河南省',366),
    ('湖北省',599)
]
#添加地图数据
map.add('地图',data,'china') #不输入地图类型'China'也默认是'China'
#设置全局选项
map.set_global_opts(
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True, #手动校准范围
        pieces=[           #范围定义是一个列表
            {'min': 1, 'max': 9, 'label': '1-9人', 'color': '#CCFFFF'},  #'color': '#CCFFFF'颜色值,详见RGB颜色对照表
            {'min': 10, 'max': 99, 'label': '10-99人', 'color': '#FFFF99'},
            {'min': 100, 'max': 299, 'label': '100-299人', 'color': '#6699FF'},
            {'min': 300, 'max':499, 'label': '300-499人', 'color': '#F38F24'},
            {'min': 500, 'max': 599, 'label': '500-599人', 'color': '#CC3333'},
            {'min': 600,  'label': '600人以上', 'color': '#990033'},
        ]
    )
)
#生成地图
map.render()

运行代码后会产生新文件render.html,用Edge浏览器打开,即可看到生成的地图。

关于Map_visualmap_piecewise的详细说明,可访问官网:

DocumentDescriptionicon-default.png?t=O83Ahttps://gallery.pyecharts.org/#/Map/map_visualmap_piecewise在设置全局选项时,用到了颜色值,颜色值是6位,什么值对应什么颜色,可通过RGB颜色对照表一一对应。

可访问如下网站进行了解RGB颜色对照表:RGB颜色对照表-RGB颜色查询对照表-颜色代码表-颜色的英文名称大全-懒人工具|www.ab173.com懒人站长工具提供RGB颜色对照表,RGB颜色查询对照表、常见的网页颜色代码表,常见颜色的英文名称颜色表查询!icon-default.png?t=O83Ahttp://www.ab173.com/gongju/ui/rgb.php

二、进阶-全国疫情地图

2.1分析文件数据

文件“ 疫情.txt ”记录了全国各个地区的疫情数据(确诊人数,治愈人数等等),文件链接:
链接:https://pan.baidu.com/s/1Q9az5lIKuWbMTIxzXRtX_A?pwd=1yts 
提取码:1yts

文件“ 疫情.txt ”是标准的json格式,我们通过网站(如下所示)可以更直观地看出数据层级。在线JSON校验格式化工具(Be JSON)在线,JSON,JSON 校验,格式化,xml转json 工具,在线工具,json视图,可视化,程序,服务器,域名注册,正则表达式,测试,在线json格式化工具,json 格式化,json格式化工具,json字符串格式化,json 在线查看器,json在线,json 在线验证,json tools online,在线文字对比工具icon-default.png?t=O83Ahttps://www.bejson.com/

使用步骤如图:

数据层级如下:

数据层级图

通过在线网站工具,点击“+",一级一级展开,体验展开过程,也许会更容易理解。

简单分析完数据层级后,我们决定要做一个反映各个省份疫情确诊人数的地图,则地图类型默认中国,地图数据类型为列表,列表内元素类型为元组,一个元组就包括:一个省份名称+确诊人数。

2.2处理数据

我们要处理一下文件“ 疫情.txt ”中的数据,数据本身就是标准的json格式,不再需要处理开头与结尾,步骤如下:

  1. 首先,我们要读取数据文件。
  2. 然后将json数据转换为python字典。
  3. 然后从字典中取出children列表内的数据(即包括省份名称+确诊人数)。
  4. 最后利用for循环组装每个省份名称+确诊人数为元组,将所有元组封装在列表内。

代码如下所示:

#准备地图数据
#读取数据文件
f=open('E:/可视化案例数据/地图数据/疫情.txt','r',encoding='UTF-8')
data=f.read()  #获取文件内全部数据
#取完数据后就用不到文件了,关闭文件即可
f.close()
#将json数据转换为python字典
data_dict=json.loads(data)
#从字典中取出省份数据
province_data_list=data_dict['areaTree'][0]['children']
#组装每个省份名称和确诊人数为元组,将所有元组封装在列表内
data_list=[]  #绘图要用到的数据列表
for province_data in province_data_list:
    province_name=province_data['name']+'省'            #省份名称,拼接字符串的原因在代码下方
    province_confirm=province_data['total']['confirm'] #确诊人数
    data_list.append((province_name,province_confirm)) #放入列表中

第三步:从字典中取出children列表内的数据(即包括省份名称+确诊人数的数据),我们需要先访问字典data_dict中的列表'areaTree',然后访问列表'areaTree'中第一个元素,其类型为字典,然后访问此字典内的列表'children',列表'children'内是各个省份的疫情数据,结合数据层级图,更容易理解。

第四步:利用for循环组装每个省份名称+确诊人数为元组,将所有元组封装在列表内,在获取省份名称的时候,我在后面拼接了字符串'省',因为现在pyecharts包要求,地区后面添加上相应后缀:省,市,行政区,最后生成的地图才会显示数据,而我们现在用的这份文件没有相应后缀,所以我拼接了字符串'省',至于市和行政区,我没有再去添加,最后生成的地图也没有市和行政区的数据,还望读者见谅。还有一个需要注意的问题:append函数的参数只有1个,我们在此处追加的是元组类型的元素,追加了一个元组,元组内是省份名称+确诊人数2个参数,不要忽略元组的括号。

回顾append函数:http://t.csdnimg.cn/kKNQE 3.3.2在列表尾部添加指定元素。回顾元组知识:http://t.csdnimg.cn/XIMOe 。

2.3构建地图

构建地图的步骤如下所示:

  1. 首先构建地图对象map
  2. 添加上一步处理好的数据
  3. 设置全局配置选项(标题,地区颜色)
  4. 生成地图

代码如下:

#构建地图
map=Map()
#添加地图数据
map.add('全国各省份确诊人数',data_list) #最后一个参数没写,默认地图类型为中国
#设置全局配置选项
map.set_global_opts(
    title_opts=TitleOpts(title='全国疫情地图'), #设置地图标题
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True, #是否分段
        pieces=[           #定义分段范围
            {'min': 1, 'max': 99, 'label': '1-99人', 'color': '#CCFFFF'},  #'color': '#CCFFFF'颜色值,详见RGB颜色对照表
            {'min': 100, 'max': 999, 'label': '100-999人', 'color': '#FFFF99'},
            {'min': 1000, 'max': 4999, 'label': '1000-4999人', 'color': '#6699FF'},
            {'min': 5000, 'max':9999, 'label': '5000-9999人', 'color': '#F38F24'},
            {'min': 10000, 'max': 99999, 'label': '10000-99999人', 'color': '#CC3333'},
            {'min': 100000,  'label': '10万人以上', 'color': '#990033'},
        ]
    )
)
#生成地图
map.render('全国疫情地图.html')  #控制生成的文件名

运行代码后会产生新文件 “ 全国疫情地图.html ” ,用Edge浏览器打开,即可看到生成的地图。

2.4完整代码

#导包
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts,TitleOpts
import json

#准备地图数据
#读取数据文件
f=open('E:/可视化案例数据/地图数据/疫情.txt','r',encoding='UTF-8')
data=f.read()  #获取文件内全部数据
#取完数据后就用不到文件了,关闭文件即可
f.close()
#将json数据转换为python字典
data_dict=json.loads(data)
#从字典中取出省份数据
province_data_list=data_dict['areaTree'][0]['children']
#组装每个省份名称和确诊人数为元组,将所有元组封装在列表内
data_list=[]  #绘图要用到的数据列表
for province_data in province_data_list:
    province_name=province_data['name']+'省'            #省份名称,拼接字符串的原因在代码下方
    province_confirm=province_data['total']['confirm'] #确诊人数
    data_list.append((province_name,province_confirm)) #放入列表中

#构建地图
map=Map()
#添加地图数据
map.add('全国各省份确诊人数',data_list) #最后一个参数没写,默认地图类型为中国
#设置全局配置选项
map.set_global_opts(
    title_opts=TitleOpts(title='全国疫情地图'), #设置地图标题
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True, #是否分段
        pieces=[           #定义分段范围
            {'min': 1, 'max': 99, 'label': '1-99人', 'color': '#CCFFFF'},  #'color': '#CCFFFF'颜色值,详见RGB颜色对照表
            {'min': 100, 'max': 999, 'label': '100-999人', 'color': '#FFFF99'},
            {'min': 1000, 'max': 4999, 'label': '1000-4999人', 'color': '#6699FF'},
            {'min': 5000, 'max':9999, 'label': '5000-9999人', 'color': '#F38F24'},
            {'min': 10000, 'max': 99999, 'label': '10000-99999人', 'color': '#CC3333'},
            {'min': 100000,  'label': '10万人以上', 'color': '#990033'},
        ]
    )
)
#生成地图
map.render('全国疫情地图.html')  #控制生成的文件名

三、进阶-山东省疫情地图

2.1分析文件数据

我们继续使用文件“ 疫情.txt ”,从其中取出山东省的数据,地图中反映山东省各城市的疫情确诊人数,地图类型选择“山东”,地图数据类型为列表,列表内元素类型为元组,一个元组就包括:山东省城市名称+确诊人数。

数据层级图如下:

2.2处理数据

我们要处理一下文件“ 疫情.txt ”中的数据,数据本身就是标准的json格式,不再需要处理开头与结尾,步骤如下:

  1. 首先,我们要读取数据文件。
  2. 然后将json数据转换为python字典。
  3. 然后从字典中取出山东省疫情数据(即包括山东省城市名称+确诊人数)。
  4. 最后利用for循环组装山东省每个城市名称+确诊人数为元组,将所有元组封装在列表内。

代码如下所示:

#准备地图数据
#读取数据文件
f=open('E:/可视化案例数据/地图数据/疫情.txt','r',encoding='UTF-8')
data=f.read()  #获取文件内全部数据
#获取文件数据完成后关闭文件
f.close()
#json数据转换为python字典
data_dict=json.loads(data)
#从字典中取出山东省城市数据
city_data_list=data_dict['areaTree'][0]['children'][11]['children']
#组装每个省份名称和确诊人数为元组,将所有元组封装在列表内
data_list=[]  #绘图要用到的数据列表
for city_data in city_data_list:
    city_name=city_data['name']+'市'    #拼接字符串的原因在2.2中已说明,请阅读本文2.2
    city_confirm=city_data['total']['confirm']
    data_list.append((city_name,city_confirm))

2.3构建地图

构建地图的步骤如下所示:

  1. 首先构建地图对象map
  2. 添加上一步处理好的数据
  3. 设置全局配置选项(标题,地区颜色)
  4. 生成地图

代码如下:

#构建地图
map=Map()
#添加地图数据
map.add('山东省各城市确诊人数',data_list,'山东') #此处地图类型为“山东”
#设置全局配置选项
map.set_global_opts(
    title_opts=TitleOpts(title='山东省疫情地图'), #设置地图标题
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True, #是否分段
        pieces=[           #定义分段范围
            {'min': 1, 'max': 9, 'label': '1-9人', 'color': '#CCFFFF'},  #'color': '#CCFFFF'颜色值,详见RGB颜色对照表
            {'min': 10, 'max': 19, 'label': '10-19人', 'color': '#FFFF99'},
            {'min': 20, 'max': 39, 'label': '20-39人', 'color': '#6699FF'},
            {'min': 40, 'max':59, 'label': '40-59人', 'color': '#F38F24'},
            {'min': 60, 'max': 79, 'label': '60-79人', 'color': '#CC3333'},
            {'min': 80,  'label': '80人以上', 'color': '#990033'},
        ]
    )
)
#生成地图
map.render('山东省疫情地图.html')  #控制生成的文件名

运行代码后会产生新文件 “ 山东省疫情地图.html ” ,用Edge浏览器打开,即可看到生成的地图。

注:因为文件内青岛市和东营市疫情数据缺失,故地图上未显示。

2.4完整代码

#导包
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts,TitleOpts
import json

#准备地图数据
#读取数据文件
f=open('E:/可视化案例数据/地图数据/疫情.txt','r',encoding='UTF-8')
data=f.read()  #获取文件内全部数据
#获取文件数据完成后关闭文件
f.close()
#json数据转换为python字典
data_dict=json.loads(data)
#从字典中取出山东省城市数据
city_data_list=data_dict['areaTree'][0]['children'][11]['children']
#组装每个省份名称和确诊人数为元组,将所有元组封装在列表内
data_list=[]  #绘图要用到的数据列表
for city_data in city_data_list:
    city_name=city_data['name']+'市'    #拼接字符串的原因在2.2中已说明,请阅读本文2.2
    city_confirm=city_data['total']['confirm']
    data_list.append((city_name,city_confirm))

#构建地图
map=Map()
#添加地图数据
map.add('山东省各城市确诊人数',data_list,'山东')
#设置全局配置选项
map.set_global_opts(
    title_opts=TitleOpts(title='山东省疫情地图'), #设置地图标题
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True, #是否分段
        pieces=[           #定义分段范围
            {'min': 1, 'max': 9, 'label': '1-9人', 'color': '#CCFFFF'},  #'color': '#CCFFFF'颜色值,详见RGB颜色对照表
            {'min': 10, 'max': 19, 'label': '10-19人', 'color': '#FFFF99'},
            {'min': 20, 'max': 39, 'label': '20-39人', 'color': '#6699FF'},
            {'min': 40, 'max':59, 'label': '40-59人', 'color': '#F38F24'},
            {'min': 60, 'max': 79, 'label': '60-79人', 'color': '#CC3333'},
            {'min': 80,  'label': '80人以上', 'color': '#990033'},
        ]
    )
)
#生成地图
map.render('山东省疫情地图.html')  #控制生成的文件名