实现效果
通过对数据的处理,调用,绘制1960-2019年全球前十GDP国家的动态柱状图,每隔一秒刷新一年的数据,下方含时间线,图表标题会随着年份变化而变化,可设置循环播放。
动态柱状图
运用到的函数
在前面我们学习过sorted函数,可以对数据容器进行排序。
在后面的数据处理中,我们需要对列表进行排序,并指定排序规则,sorted函数就无法完成了。我们补充学习列表的sort方法。
使用方式:
列表.sort(key=选择排序依据的函数, reverse=TrueFalse)
- 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
- 参数reverse,是否反转排序结果,True表示降序,False表示升序
代码部分
(1)导入需要的包,读取数据
from pyecharts.options import LabelOpts,TitleOpts
from pyecharts.charts import Bar,Timeline,ThemeRiver
from pyecharts.globals import ThemeType
# 读取数据open
f = open("D:\1960-2019全球GDP数据.CSV")
data_lines = f.readlines()
# 关闭文件
f.close()
(2)处理数据
数据格式如下:
因为第一条数据没有用,所以需要先把第一条数据删除掉。再将对应年份的数据取出来,对应不同国家的数据放到一起,存储为{年份:〔[国家,gdp],[国家, gdp],...... ],年份:[[国家,gdp],【国家, gdp],...... ],..
这样的字典格式 以方便后续生成图像。代码如下
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储,格式为:
# {年份:〔[国家,gdp],[国家, gdp],...... ],年份:[[国家,gdp],【国家, gdp],...... ],......
# 定义一个字典对象
data_dict = {}
for line in data_lines:
year = int(line.split(",")[0]) # 年份
country = line.split(",")[1] # 国家
gdp = float(line.split(",")[2]) # gdp数据
# 如何判断字典里有没有指定的key
# 可以用in和 not in方式判断
try:
data_dict[year].append([country,gdp])
except KeyError:
data_dict[year]=[]
data_dict[year].append([country, gdp])
# print(data_dict)
(3)创建时间线对象,构建柱状图和图表设置
动态图的本质是基于每一个时间的数据,创建每一年的bar,按照时间线生成多个柱状图,然后每隔一秒换对应表格的数据,依次播放这些图表,从而达到动态的效果,因此,我们需要创建对应的时间线对象,从而控制图表按照时间线依次进行变化。
代码如下:
# for循环每一年的数据,基于每一年的数据,创建每一年的bar对象#在for中,将每一年的bar对象添加到时间线中
for year in sorted_year_list:
data_dict[year].sort(key=lambda element: element[1],reverse=True)
# 取出排名前10的国家
year_data = data_dict[year][0:10]
x_data = []
y_data = []
for country_gdp in year_data:
x_data.append(country_gdp[0]) # x轴添加国家
y_data.append(country_gdp[1]/100000000) # Y轴添加gdp数据
# 构建柱状图
bar = Bar()
x_data.reverse()
y_data.reverse()
bar.add_xaxis(x_data)
bar.add_yaxis("GDP(亿)",y_data,label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar.reversal_axis()
# 设置每一年的图表的标题
bar.set_global_opts(
title_opts=TitleOpts(title=f"{year}年全球前十GDP数据")
)
timeline.add(bar,str(year)) # 在时间线添加点位
(4)时间线设置
创建好对应的时间线图表后,我们可以设置时间线的一些特征,例如自动播放的时间间隔,是否显示时间线轴,是否自动播放和循环播放等,更多特征可以查阅add_schema包含的内容。
代码如下:
# 设置时间线自动播放
timeline.add_schema(
play_interval=1000, # 自动播放的时间间隔,单位毫秒
is_timeline_show=True, # 是否在播放的时候,显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=False # 是否循环播放
)
(5)绘图
处理好数据和时间轴之后,就可以进行动态图的绘制了。
# 绘图
timeline.render("1960-2019全球GDP前十国家.html")
所有代码按顺序放入编辑器运行后,即会生成对应的动态图。需要注意的是,最后一步的绘图采用的是生成html方式,运行py文件后会生成一个名为1960-2019全球GDP前十国家.html
的html文件,双击该html文件,右上角会显示浏览器图标,任选一个打开即可看到效果。
所用到的数据是这个: 提取码:2ex6
祝大家学习愉快!有问题欢迎讨论!