10.5 练习三:动态柱状图

基础柱状图

通过 Bar 构建基础柱状图

快速上手 Quickstart:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from pyecharts.charts import Bar
from pyecharts.options import *

# 构建柱状图对象
bar = Bar()

# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
bar.add_yaxis("GDP",[30,20,10], label_opts=LabelOpts(position="right"))

# 反转xy轴
bar.reversal_axis()

# 绘图
bar.render("基础柱状图.html")

基础时间线柱状图

前置知识

Timelime()–时间线

柱状图描述的是分类数据,回答的是每一个分类中『有多少?』这个问题. 这是柱状图的主要特点,同时柱状图很难动态的描述一个趋势性的数据. 这里pyecharts为我们提供了一种解决方案-时间线

如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象

快速上手:创建时间线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
bar1.add_yaxis("GPD",[30,20,10],label_opts=LabelOpts(position="right"))
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GPD",[50,30,20],label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

# 创建时间线对象
timeline = Timeline()
# timeline对象添加bar柱状图
timeline.add(bar1,"2021年GDP")
timeline.add(bar2,"2022年GDP")

# 通过时间线绘图
timeline.render("基础柱状图-时间线.html")

自动播放

1
2
3
4
5
6
7
# 设置自动播放
timeline.add_schema(
    play_interval=1000,		# 自动播放的时间间隔
    is_timeline_show=True,	# 是否在自动播放时显示时间线
    is_auto_play=True,		# 是否自动播放
    is_loop_play=True		# 是否循环自动播放
)

主题(颜色)设置

1
2
3
4
from pyecharts.globals import ThemeType

# 创建时间线对象,注意代码位置在创建时间线对象之后,向时间线添加bar之前
timeline = Timeline({"theme":ThemeType.LIGHT})

主题代码一览:

编号 颜色 备注
ThemeType.WHITE 红蓝 默认颜色等同于 bar = Bar()
ThemeType.LIGHT 蓝黄粉 高亮颜色
ThemeType.DARK 红蓝 黑色背景
ThemeType.CHALK 红蓝绿 黑色背景
ThemeType.ESSOS 红黄 暖色系
ThemeType.INFOGRAPHIC 红蓝黄 偏亮
ThemeType.MACARONS 紫绿
ThemeType.PURPLE_PASSION 粉紫 灰色背景
ThemeType.ROMA 红黑灰 偏暗
ThemeType.ROMANTIC 红粉蓝 淡黄色背景

实操上手

观察图样并分析,发现最终效果图中需要:

  1. GDP数据处理为亿级
  2. 有时间轴,按照年份为时间轴的点
  3. x轴和y轴翻转,同时每一年的数据只要前8名国家
  4. 有标题,标题的年份会动态更改
  5. 设置了主题为LIGHT

数据处理

下载本节所需要的数据百度网盘 请输入提取码,用记事本等文本编辑器打开,发现是下面这种以逗号隔开的简单数据格式:

1
2
3
4
5
6
7
8
year,GDP,rate
1960,美国,5.433E+11
1960,英国,73233967692
1960,法国,62225478000
1960,中国,59716467625
1960,日本,44307342950
1960,加拿大,40461721692
......以下省略......

首先是 读取文件,注意这里因为文字编码的原因要用 GB2312 格式打开,不过不知道为什么也没关系,其次就是要调用之前学到的readlines方法按行读取全部数据

1
2
3
f = open('T:/1960-2019全球GDP数据.csv','r',encoding='GB2312')
data_lines = f.readlines()
f.close()

print打印一下看看:

['year,GDP,rate\n', '1960,美国,5.433E+11\n', '1960,英国,73233967692\n', ......

很好,看来它的格式是列表,接下来把第一条表头删去

1
data_lines.pop(0)

下面要将列表形式的数据转为字典存储,格式为:{年份:[[国家1:gdp],[国家2:gdp],......],年份:[[国家1:gdp],[国家2:gdp],......]}

使用 for 循环加上6.3 数据容器:字符串中2.3字符串的分割取得我们需要的各部分元素

‼️‼️ 注意:按照我们上面的构想,在循环时会出现两种情况——

第一种:这个年份的key字典里已经有了,所以我只要往它的value里追加内容就行;

第二种:正好循环到了一个新的年份,这时候字典里还没有这个年份的key,如果要像上面一样往这个不存在的key的value里追加内容肯定会报错;

因此这里我们需要使用异常的捕获!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
data_dict = {}
for line in data_lines:
    year = int(line.split(',')[0])		# 以整数数字形式而不是字符串存储年份
    country = line.split(',')[1]			
    gdp = float(line.split(',')[2])		# 将部分使用了科学计数法的gdp数值转为正常数字
    # 下面将判断字典中是否有指定的key?
    try:
        data_dict[year].append([country,gdp])
    except KeyError:
        data_dict[year] = []			# 没有就先创一个
        data_dict[year].append([country,gdp])

绘图

通过本节开始的任务分析我们可以得知,要想每年都生成一个柱状图就必须使用for循环刚才的字典文件

但是因为某些特性,循环时年份不一定是从前到后的顺序,所以这里我们单独对年份排下序再对它进行循环:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
sorted_year_list = sorted(data_dict.keys())

timeline = Timeline()   # 创建时间轴

for year in sorted_year_list:
    data_dict[year].sort(key=lambda element:element[1],reverse=True)
    yearly_data = data_dict[year][0:8]	# 排序取前八
    
    # 这里取反是因为构建出的图表按顺序会从下往上排,如果不反转不符合图样要求
    yearly_data.reverse()	# 读者也可注释掉这行比较一下				
    
    x_data = []		# 含国家
    y_data = []		# 含GDP
    for country_gdp in yearly_data:
        x_data.append(country_gdp[0])
        y_data.append(country_gdp[1] / 100000000) 	# y轴添加gdp,记得以亿为单位

忘记什么是lambda函数了?复习一下吧→7.1 进阶函数

接下来导包并构建柱状图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *				# 导包

# 下面的代码也是包含在for year in sorted_year_list:里的
    bar = Bar()
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP(亿)",y_data,label_opts=LabelOpts(position="right"))
    # 反转x、y轴
    bar.reversal_axis()
    # 创建并添加图表到时间轴
    timeline.add(bar,str(year))

timeline.add_schema(			# 别忘了自动播放,不然不显示
    play_interval=1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=False
)
timeline.render()

到目前,当前案例的主体部分已经完成,接下来还差一些小细节

加个标题(位置在在添加图表到时间轴之前)

1
2
3
bar.set_global_opts(
    title_opts = TitleOpts(title=f"{year}年全球前8GDP数据")
)

改下主题

1
2
3
4
# 记得导包
from pyecharts.globals import ThemeType
# 把创建时间轴的语句改为
timeline = Timeline({"theme":ThemeType.LIGHT})

完整版

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *	
from pyecharts.globals import ThemeType
f = open('T:/1960-2019全球GDP数据.csv','r',encoding='GB2312')
data_lines = f.readlines()
f.close()
data_lines.pop(0)
data_dict = {}
for line in data_lines:
    year = int(line.split(',')[0])		# 以整数数字形式而不是字符串存储年份
    country = line.split(',')[1]			
    gdp = float(line.split(',')[2])		# 将部分使用了科学计数法的gdp数值转为正常数字
    # 下面将判断字典中是否有指定的key?
    try:
        data_dict[year].append([country,gdp])
    except KeyError:
        data_dict[year] = []			# 没有就先创一个
        data_dict[year].append([country,gdp])
sorted_year_list = sorted(data_dict.keys())

timeline = Timeline({"theme":ThemeType.LIGHT})   # 创建时间轴

for year in sorted_year_list:
    data_dict[year].sort(key=lambda element:element[1],reverse=True)
    yearly_data = data_dict[year][0:8]	# 排序取前八
    # 这里取反是因为构建出的图表按顺序会从下往上排,如果不反转不符合图样要求
    yearly_data.reverse()	# 读者也可注释掉这行比较一下				
    x_data = []		# 含国家
    y_data = []		# 含GDP
    for country_gdp in yearly_data:
        x_data.append(country_gdp[0])
        y_data.append(country_gdp[1] / 100000000) 	# y轴添加gdp,记得以亿为单位
    bar = Bar()
    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}年全球前8GDP数据")
    )
    # 创建并添加图表到时间轴
    timeline.add(bar,str(year))

timeline.add_schema(			# 别忘了自动播放,不然不显示
    play_interval=1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=False
)
timeline.render()        

成品展示


尾声

至此,第一阶段的Python基础编程已经学完,下面我们要学习第二阶段Python面向对象的编程~

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS