更多内容点击查看数据可视化 | 3D 柱状图一览各省农民合作社存量近十年变化
本文目录
一、前言
二、数据介绍
三、数据预处理
四、pyecharts 简介
五、制图代码
六、总结
七、相关推荐
本文共6637个字,阅读大约需要17分钟,欢迎指正!
Part1 前言
数据可视化系列的上一期文章我们分享了使用 Python 制作动态柱状图,并制作成了 GIF 动图,这种可视化图形具有明显优势,统计数据中各个主体的指标值随时间的动态变化能够得到淋漓尽致地展现。我们能够清楚的看到某个主体持续霸榜,又或者某个主体草根逆袭……可能这就是数据可视化的魅力所在吧。
而本期文章我们将介绍另外一种数据可视化图形 —— 3D柱状图,它也是一个能够对多区域、跨时间统计数据进行可视化的图形,还可以自由选择可视化角度,就像下面这样:
Part2 数据介绍
上面的 3D 可视化图形展示的是 2013 - 2022 年全国各省(不含港澳台数据)每年存量农民专业合作社的数量。从图中可以看出,山东、河南两省合作社总量领跑全国,北京、上海等非农业强省十年来变化不大。
本文使用的统计数据来源于浙大卡特-企研中国涉农研究数据库(CCAD),由企研数据(r.qiyandata.com)整理提供,原始数据为 2007 - 2022 年全国各省市合作社进入数量、合作社退出数量以及合作社存量。
浙大卡特-企研中国涉农研究数据库( China Academy for Rural Development-Qiyan China Agri-research Database(CCAD),Zhejiang University )由企研数据携手浙江大学中国农村发展研究院(简称“卡特”)共同发起,为助力国家乡村振兴发展战略,服务“三农”及相关领域学术研究及智库建设而倾力打造的涉农研究大数据库。
图源:企研·社科大数据平台(r.qiyandata.com)
💡 后台回复关键字 “20231110” 即可获取本文所用数据以及完整数据可视化代码。
Part3 数据预处理
数据可视化的一大准备工作就是将已有的统计数据转换为可视化工具能够解析的数据。本文介绍的是 3D 柱状图的绘制,在 3D 柱状图中,X 轴和 Y 轴可以确定柱体的位置,Z 轴则决定了柱体的高度,再由可视化工具帮助渲染对应的颜色。所以首先要将统计数据转化为(X,Y,Z)这种三维点位数据。
# 导入表格处理工具 pandas
import pandas as pd
# 读取统计表格
data = pd.read_excel('./基础涉农主体(省市)-历年各省市合作社数量统计(2007年-2022年)_企研数据2023.xlsx')
# 只保留年份、省份信息和合作社存量数据; 需要保证年份和指标字段中的数据都是数值,不能是字符串
data = data[['年份', '省份', '合作社存量']]
# 只保留仅 2013-2022 近十年的数据
data = data[data['年份'].between(2013, 2022)]
# 分组聚合,按年合并地级市数据,得到省份数据
data = data.groupby(by=['年份', '省份'], as_index=False).sum()
## 制作 3D 柱状图需要保证数据中每一年的主体顺序都一样,这里要对数据排序
# 省份总体顺序按照最后一年(2022)年合作社存量的大小排列,降序排列
# 这个顺序在绘图时会直接应用在 X 轴上
province_order = data[data['年份']==2022].sort_values(by='合作社存量', ascending=False)['省份'].to_list()
# 将省份字段转换为分类变量,再按照"年份"和"省份"进行排序
data['省份'] = pd.Categorical(data['省份'], categories=province_order, ordered=True)
data = data.sort_values(by=['年份', '省份'])
## 表格处理完毕后,将其转为点位数据
# 省份名称,不含港澳台数据
provinces = list(data['省份'][:31])
# 年份
years = list(range(2013, 2023))
# 合作社存量数值
values = list(data['合作社存量'])
# 创建空列表,用于存储所需数据
points = []
for year_index, year in enumerate(years):
for provinces_index, provinces in enumerate(province_order):
value = values[0]
values.pop(0)
points.append([provinces_index, year_index, value])
points # 查看所得结果
'''
[[0, 0, 102836],
[1, 0, 70960],
[2, 0, 25309],
[3, 0, 42323],
[4, 0, 37953],
[5, 0, 60296],
[6, 0, 37090],
[7, 0, 31700],
[8, 0, 64739],
[9, 0, 52732],
[10, 0, 39891],
…… ……
'''
经过上述预处理步骤后,得到了可用的三维点位数据。
Part4 pyecharts 简介
本文中制作 3D 柱状图的工具是 Python 第三方库 pyecharts。提起 pyecharts,就不得不说一下它的前身 —— Echarts(https://echarts.apache.org/zh/index.html),它是由百度公司开发的一个基于 JavaScript 的开源可视化图表库,后于 2018 捐献给了 Apache(阿帕奇) 基金会并成为了 Apache 的孵化项目。而 Apache 是世界使用排名第一的Web服务器软件,最流行的Web服务器端软件之一。
本文所使用的工具 pyecharts 则是 Echarts 的 Python 实现,它的存在是为了让 ECharts 可以在 Python 环境中方便被调用,使得 Python 的数据处理能力可以很好地结合 ECharts 的数据可视化功能。我们在 pyecharts 的官方网站中可以看到,该工具支持多种可视化图形的制作,包括基本可视化图形、各种 3D 图形、组合图表、地理可视化图形等等,甚至还可以用来制作词云图(虽然效果很 lj),并且还附带制作各种图形的样例代码。pyecharts 官方网站链接如下:
https://pyecharts.org/#/zh-cn/composite_charts
笔者使用的 Python pyecharts 库版本为 1.9.1,如果你希望安装跟笔者一样的版本,可以在终端中使用下面的命令。
pip install pyecharts==1.9.1
如果你想安装或者升级为最新版本,可以使用下面的命令。
pip install pyecharts -U
Part5 制图代码
## 部分省份全称太长,导致无法正常显示,所以需要将省份全称映射为简称。
## 每一个省份名称的前面和中间都插入换行符,让省份名称纵向排列,防止 X 轴文字遮挡
province_map = {'山东省':'山东', '河南省':'河南', '湖南省':'湖南',
'安徽省':'安徽', '湖北省':'湖北', '河北省':'河北',
'四川省':'四川', '甘肃省':'甘肃', '山西省':'山西',
'黑龙江省':'黑龙江', '吉林省':'吉林', '江西省':'江西',
'陕西省':'陕西', '内蒙古自治区':'内蒙古', '云南省':'云南',
'辽宁省':'辽宁', '贵州省':'贵州', '广西壮族自治区':'广西',
'广东省':'广东', '江苏省':'江苏', '新疆维吾尔自治区':'新疆',
'浙江省':'浙江', '福建省':'福建', '重庆市':'重庆',
'青海省':'青海', '海南省':'海南', '宁夏回族自治区':'宁夏',
'西藏自治区':'西藏', '天津市':'天津', '上海市':'上海',
'北京市':'北京'}
# 省份全称映射为省份简称,变量 province_order 是数据预处理时得到的
province_order_new = [province_map[province] for province in province_order]
# 在省份简称中插入换行符,这样所有的省份名称都会变为纵向,避免了 X 轴文字重叠遮挡
province_order_new = ['\n'+'\n'.join(list(prov)) for prov in province_order_new]
## 开始绘图
c = (
Bar3D(init_opts=opts.InitOpts(width="1600px", height="900px"))
.add(
series_name="", # 图形名称,建议设置为空字符
data = points, # 三维点位数据
grid3d_opts=opts.Grid3DOpts(width=200, depth=100), # X、Y 轴的长度
xaxis3d_opts=opts.Axis3DOpts(province_order_new, # X 轴上的刻度名称,对应的应该是省份名称
type_="category", # X 轴类型
name=' ', # X 轴名称,默认是'X'
interval=0), # X 上刻度名称的显示频率,为 1 表示每隔一个显示一次,为0表示每一个都显示
yaxis3d_opts=opts.Axis3DOpts(years, # Y 轴上的刻度名称,对应的应该是年份
type_="category", # Y 轴类型
name='年份', # Y 轴名称,默认是'Y'
interval=0), # Y 上刻度名称的显示频率
zaxis3d_opts=opts.Axis3DOpts(type_="value", # Z 轴类型,对应数据值
name='合作社存量'), # Z 轴名称,默认是'Z'
)
.set_global_opts(
title_opts=opts.TitleOpts(title=""), # 设置图形的标题
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 是否显示图例
min_=0, # 图例最小值,建议根据实际数据的大小而定
max_=250000, # 图例最大值,建议根据实际数据的大小而定
is_piecewise=True, # 图例是否分段,若不分段,则为连续型图例
split_number=25, # 段落数量,由于每一个段落都对应着种个颜色,所以这个参数也决定了图形中最大色彩数量
pos_left="right", # 图例的相对位置
precision=0, # 图例中数值范围的精确程度,控制小数点后的位数
# item_width= 30, # 图例色块的宽度,系统会自动设置合适的大小
# item_height = 15, # 图例色块的高度,系统会自动设置合适的大小
# range_color 参数用于控制色彩的梯度变化,需要传入至少两个颜色,系统会自动根据你设置的段落数量
# 分配中间颜色,也可以传入多个颜色,系统同样会优化色彩分布。注意需要将低数值对应的颜色放在前面,
# 高数值对应的颜色放在后面,十六进制色彩预览、调色可以参考这个网站:http://www.ku51.net/rgbhex.html
range_color=[
"#313695", # 深蓝色
"#4575b4",
"#74add1",
"#abd9e9",
"#e0f3f8",
"#ffffbf",
"#fee090",
"#fdae61",
"#f46d43",
"#d73027",
"#a50026", # 深红色
]),
)
.render("3D柱状图.html") # 将所绘图形渲染为本地 HTML 文件,可在浏览器中查看并自由旋转、缩放图形
)
运行上述代码后,代码文件夹将会生成一个 html 文件,在联网环境下使用浏览器打开生成的 html 文件就可以在浏览器中查看可视化图形了,同时还可以自由旋转、缩放图形以及进行简单的交互等。
Part6 总结
💡 本文向大家介绍了 Python 中十分强大的数据可视化工具 pyecharts,使用它可以制作各种各样的可视化图形,这也展示了 Python 语言的强大生态,后续说不定我们还会向大家分享更多使用 pyecharts 进行数据可视化的精彩案例。
如果你想学习各种 Python 编程技巧,提升个人竞争力,那就加入我们的数据 Seminar 交流群吧(点击原文数据可视化 | 3D 柱状图一览各省农民合作社存量近十年变化查看入群方式),欢迎大家在社群内交流、探索、学习,一起进步!同时您也可以分享通过数据 Seminar 学到的技能以及得到的成果。