基础柱状图
通过 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 |
红粉蓝 |
淡黄色背景 |

实操上手
观察图样并分析,发现最终效果图中需要:
- GDP数据处理为亿级
- 有时间轴,按照年份为时间轴的点
- x轴和y轴翻转,同时每一年的数据只要前8名国家
- 有标题,标题的年份会动态更改
- 设置了主题为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: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面向对象的编程~