查看原文
其他

数据可视化 | 太酷了!用 Python 绘制3D地理分布图

快点关注→ 数据Seminar 2022-12-31

目录

一、前言

二、用 Python 做地理可视化

  1. 绘制平面地理分布图

  2. 绘制 3D 地理分布图

三、总结

本文共4877个字,阅读大约需要15分钟,欢迎指正!

Part1前言

在我们的日常工作中,经常会使用绘图等可视化的方式使人们更加直观地感受数据。当我们需要对比展示不同地区的某项指标时,可以使用直方图进行简单的可视化,但这种方式并不能在视觉上突出地域之间的差异,因此我们可以考虑使用地理可视化的方式来展示不同地区地差异。
在本期文章中我们介绍如何使用 Python 绘制 2021 年全国各省级地区的 GDP 总量地理分布图。
绘图数据——2021 年全国各省级地区 GDP 总量,数据来源于国家统计局(不含香港、澳门和台湾的数据)。

Part2用 Python 做地理可视化

Python 中不乏优秀的数据可视化库,但是常见的支持地理数据可视化的并不多,pyecharts 就是其中之一,也是我们接下来要使用的地理可视化 Python 库。
上期一介绍词云绘制的文章中,我们已经简单使用过 pyecharts 库,尽管在词云绘制方面不尽人意,但在传统数据可视化和地理数据可视化方面绝对是一个非常强大的工具。下面我们就使用它来演示如何制作地理分布图。

1绘制平面地理分布图

绘图之前需要加载数据,我们依然使用老伙计 Pandas 来读取数据,代码如下:
import pandas as pd
# 2021各省份GDP总量.xlsx 是从国家统计局获取的2021各省GDP数据 Excel 表
data = pd.read_excel('2021各省份GDP总量.xlsx')
data.head(5)   # 输出前五行数据
读取数据后再将数据转换为 pyecharts 所需要的二维列表格式,转换数据格式的代码如下:
Province = list(GDP['地区'])
gdp = list(GDP['2021年GDP总量(亿元)'])
Value_list = [list(z) for z in zip(Province,gdp)]
Value_list[:3]   # 展示前三个
# [['广东', 124369.7], ['江苏', 116364.2], ['山东', 83095.9]]

📌小贴士

考虑到易用性,pyecharts 能够识别到省级的地区名称均是简称,例如北京、内蒙古,而不是北京市、内蒙古自治区。
下面我们使用 pyecharts 根据前面读取的数据制作地理分布图,代码如下:
from pyecharts.charts import Map  # 导入地图模块
from pyecharts import options as opts

# 变量 c 是我们结果数据的保存路径
# 除此之外就没有什么实际意义了,这样写是为了方便写注释,便于梳理代码结构
c = (
    Map(init_opts=opts.InitOpts(width="1600px", height="900px")) # 设置图的长和宽
    .set_global_opts(
        # 地理分布图的标题,默认放置在图的左上方
        title_opts=opts.TitleOpts(title="2021 年全国各省级地区 GDP 总量地理分布图"),
        visualmap_opts=opts.VisualMapOpts(
            is_show = True,   # 是否显示图例
            max_=130000,      # 数值区间最大值, 最好根据数据的范围定义
            min_=0,           # 数值区间最小值
            split_number=13,  # 分成 13 个区间
            # 下面是简单设置图例的参数
            range_text = ['GDP 总量区间:''数据来源于国家统计局'],     # 图例上/下方的的描述性文字
            range_color = ['#F5F5DC''#8B2323'], # 不同数值的颜色显示,只需要提供两个极端的颜色,系统会自动补齐中间的过渡色
                                                  # 需要注意颜色的顺序,应该将底数值对应的颜色放在前面。
            is_calculable = False,
            item_width = 40,  # 颜色图例的长
            item_height = 20, # 颜色图例的宽
            is_piecewise=True,# 定义图例为分段型,为False时
        )
    )
    .add("", Value_list, maptype="china")# 导入需要的数据(前面转换换过的),添加地图,我们使用中国地图
    .render("海洋统计_new.html")           # .render() 用于保存数据可视化结果为 Html
)
运行上面的代码后,会在我们指定的路径下生成一个 Html 文件,鼠标双击文件即可使用浏览器打开,我们可以在浏览器中随意拖动,缩放图形进行观察或截图;当鼠标停留在某地区时,会显示具体的数值;鼠标停留在左下角图例中某范围时,数值在该区间的地区会高亮显示。如下图所示:
颜色是数据可视化图形中最能显示差异的要素之一,观察上图可以看出,GDP 总量最高的地区以红褐色显示,随着 GDP 数值的降低,对应颜色的色温也在逐渐降低,最后降到米黄色,没有数值的地区始终显示为灰色 。我们以色温的变化来展示 GDP 的变化,观察代码和注释可以发现,我们其实仅传入了米黄色和红褐色这两种颜色,随后系统会自动根据颜色区域的数量(见参数 split_number)填充中间范围的过度颜色,这一点非常人性化。另外当我们需要可视化其他指标时,可以自主选择合适的颜色。选择和调配颜色可以到这个网站:http://www.ku51.net/rgbhex.html

2绘制 3D 地理分布图

或许会有人说,虽然地理可视化平面图更加直观了,但是我们并不能观察到更细节的对比,比如 1 和 9999 同在一个数据区间内,并以相同的颜色显示,这就不能展示他们之间的差异了。如果你有这样的问题,那么我们可以将地理图柱状图结合一下,来制作一个 3D 地理分布图(含数据柱和数值)。代码如下:
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType, ChartType

# 地区数据柱显示的位置(经纬度坐标点)
dicts_all = {'广东': [113.28064, 23.125177], '北京': [116.405289, 39.904987],
             '湖北': [114.3896, 30.6628], '浙江': [120.21032, 30.246687],
             '福建': [119.4543, 25.9222], '江西': [116.0046, 28.6633],
             '黑龙江': [127.9688, 45.368], '上海': [121.4648, 31.2891],
             '内蒙古': [110.3467, 41.4899], '吉林': [125.8154, 44.2584],
             '辽宁': [123.1238, 42.1216], '河北': [114.4995, 38.1006],
             '四川': [103.9526, 30.7617], '重庆': [108.384366, 30.439702],
             '山东': [117.1582, 36.8701], '河南': [113.4668, 34.6234],
             '江苏': [118.8062, 31.9208], '安徽': [117.29, 32.0581],
             '新疆': [87.9236, 43.5883], '西藏': [91.11, 29.97],
             '湖南': [113.0823, 28.2568], '贵州': [106.6992, 26.7682],
             '广西': [108.479, 23.1152], '海南': [110.3893, 19.8516],
             '天津': [117.4219, 39.4189], '山西': [112.3352, 37.9413],
             '陕西': [109.1162, 34.2004], '甘肃': [103.5901, 36.3043],
             '宁夏': [106.3586, 38.1775], '青海': [101.4038, 36.8207],
             '云南': [102.71225, 25.040609]}   
# 转换数据,为数据提供所需格式的数据,
# 所需数据格式为 {'地区名1':[经度1,纬度1,数值1], '地区名2':……}
for item in [list(z) for z in zip(GDP['地区'], GDP['2021年GDP总量(亿元)'])]:
    dicts_all[item[0]].append(item[1])

(Map3D(init_opts=opts.InitOpts(width="1800px", height="1000px"))
 .add_schema(
    itemstyle_opts=opts.ItemStyleOpts(
        color="rgb(70,130,180)",# 通过控制 R.G.B 三原色的权重来调整地图底色
                                # 如何自定义颜色可以浏览此网站:http://www.ku51.net/rgbhex.html
        opacity=1,
        border_width=0.8,
        border_color="rgb(162,215,213)"),  # 各省边界线的颜色
    map3d_label=opts.Map3DLabelOpts(
        is_show=False,
        formatter=JsCode("function(data){return data.name + " " + data.value[2];}")),
    emphasis_label_opts=opts.LabelOpts(
        is_show=False,
        color="#FFDAB9",
        font_size=10,
        background_color="rgba(0,23,11,0)"),
    light_opts=opts.Map3DLightOpts(
        main_color="#fff",
        main_intensity=1.2,
        main_shadow_quality="high",
        is_main_shadow=False,
        main_beta=10,
        ambient_intensity=0.3))
 .add(
    series_name="",
    data_pair=list(zip(list(dicts_all.keys()), list(dicts_all.values()))),
    type_=ChartType.BAR3D,
    bar_size=1,
    shading="lambert",
    label_opts=opts.LabelOpts(
        is_show=True,
        formatter=JsCode("function(data){return data.name + ' ' + data.value[2];}")))
 .set_global_opts(title_opts=opts.TitleOpts(
        title="2021 年全国各省级地区 GDP 总量地理分布柱状图")    # 图形的标题
        )).render("地理分布3D柱状图.html")     # 可视化图形结果的保存路径(含文件名,需要是 html 文件)


使用 3D 地理柱状图不仅可以在指定位置添加数据柱,还在数据柱顶端显示具体的文字和数值,且无论如何旋转图形,文字和数值都面向我们。这样的可视化效果是否让各位看官满意呢?

Part3总结

本期文章我们向大家介绍了如何使用 Python 制作省份数据可视化,包括平面图形和 3D 图形。在日常工作中,类似的可视化应用非常广泛,学会这个技能之后,我们也可以自己制作地理分布图啦!



星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧

往期推荐


基本无害 | 管用的工具变量——工具变量和因果关系

数据可视化 | 讲究!用 Python 制作词云图学问多着呢

软件应用 | 自给自足,免费分享!TVP-VAR(时变参数向量自回归模型)MATLAB代码(作图修改版)

基本无害 | 使回归有意义 —— 附录:平均倒数加权函数的推导

基本无害 | 使回归有意义——回归的细节(全)

大数据分析 | 用 Python 做文本词频分析

企业数据库匹配系列(三)|专利库与工企库匹配报告(下)




数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 两米哥


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存