我们绘制一个关于三种水果销售额的柱状图,X轴数据为三种水果的名称,用列表['苹果','香蕉','橘子']添加进去,Y轴数据为三种水果的销售额,用列表[50,70,60]添加进去。
步骤:
代码如下:
- #导包
- from pyecharts.charts import Bar
- #构建柱状图对象
- bar=Bar()
- #添加X轴数据
- bar.add_xaxis(['苹果','香蕉','橘子'])
- #添加Y轴数据
- bar.add_yaxis('销售额',[50,70,60])
- #生成地图
- bar.render('基础柱状图.html')
运行代码后,同文件目录下生成新文件“基础柱状图.html”,用Edge浏览器查看生成的图表。


如果我们想要反转x和y轴,并让数值标签位于右侧:
- #导包
- from pyecharts.charts import Bar
- from pyecharts.options import *
- #构建柱状图对象
- bar=Bar()
- #添加X轴数据
- bar.add_xaxis(['苹果','香蕉','橘子'])
- #添加Y轴数据
- bar.add_yaxis('销售额',[50,70,60],label_opts=LabelOpts(position='right'))#数值标签位于右侧
- #反转X轴Y轴
- bar.reversal_axis()
- #生成地图
- bar.render('基础柱状图.html')
生成的图表:

Timeline()-时间线: 柱状图描述的是分类数据,回答的是每一个分类中有多少这个问题。柱状图很难动态的描述一个趋势性的数据,pyecharts为我们提供了一种解决方案——时间线。
如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象,如下图所示:

我们绘制一个表示3个月水果销售额的基础时间线柱状图:
- #导包
- from pyecharts.charts import Bar,Timeline
- from pyecharts.options import *
-
- #构建1月水果销售额柱状图
- bar1=Bar()
- bar1.add_xaxis(['苹果','香蕉','橘子'])
- bar1.add_yaxis('销售额',[50,70,60])
- bar1.reversal_axis()#反转X轴Y轴
-
- #构建2月水果销售额柱状图
- bar2=Bar()
- bar2.add_xaxis(['苹果','香蕉','橘子'])
- bar2.add_yaxis('销售额',[90,40,70])
- bar2.reversal_axis()#反转X轴Y轴
-
- #构建3月水果销售额柱状图
- bar3=Bar()
- bar3.add_xaxis(['苹果','香蕉','橘子'])
- bar3.add_yaxis('销售额',[30,50,80])
- bar3.reversal_axis()#反转X轴Y轴
-
- #创建时间线对象
- timeline=Timeline()
-
- #timeline对象添加bar柱状图
- timeline.add(bar1,'1月水果销售额')
- timeline.add(bar2,'2月水果销售额')
- timeline.add(bar3,'3月水果销售额')
-
- #生成图表
- timeline.render('基础时间线柱状图.html')
生成的图表:

除了手动点击时间线上的点来切换图表,我们还可以设置自动播放,设置主题(达到更美观的效果),代码如下:
- #构建1月水果销售额柱状图
- bar1=Bar()
- bar1.add_xaxis(['苹果','香蕉','橘子'])
- bar1.add_yaxis('销售额',[50,70,60])
- bar1.reversal_axis()#反转X轴Y轴
-
- #构建2月水果销售额柱状图
- bar2=Bar()
- bar2.add_xaxis(['苹果','香蕉','橘子'])
- bar2.add_yaxis('销售额',[90,40,70])
- bar2.reversal_axis()#反转X轴Y轴
-
- #构建3月水果销售额柱状图
- bar3=Bar()
- bar3.add_xaxis(['苹果','香蕉','橘子'])
- bar3.add_yaxis('销售额',[30,50,80])
- bar3.reversal_axis()#反转X轴Y轴
-
- #创建时间线对象
- timeline=Timeline(
- {'theme':ThemeType.ROMANTIC} #设置主题
- )
-
- #timeline对象添加bar柱状图
- timeline.add(bar1,'1月水果销售额')
- timeline.add(bar2,'2月水果销售额')
- timeline.add(bar3,'3月水果销售额')
-
- #设置自动播放
- timeline.add_schema(
- play_interval=1000, #自动播放的时间间隔,单位毫秒
- is_timeline_show=True, #是否在自动播放时显示时间线
- is_auto_play=True, #是否自动播放
- is_loop_play=True #是否循环自动播放
-
- )
-
- #生成图表
- timeline.render('基础时间线柱状图.html')
生成的图表会自动播放,视频形式更方便展示:ROMANTIC主题自动播放的基础时间线柱状图-CSDN直播ROMANTIC主题自动播放的基础时间线柱状图https://live.csdn.net/v/423471
不同主题对应的颜色:

想了解更多柱状图的用法,请访问官网:DocumentDescription
https://gallery.pyecharts.org/#/Bar/README
本节所用文件链接:
链接:https://pan.baidu.com/s/13ClaKEHF_Cu5wbuOqd4TTg?pwd=oz6z
提取码:oz6z
文件 “ 1960-2019全球GDP数据.csv ” 内的数据如下图所示(建议使用Notepad++打开):

我们要把文件内的数据转化为柱状图,如下面的效果图所示:

简单分析后,发现效果图中的数据需要按照GDP排序,我们在对比总结各类数据容器时学习过sorted函数,sorted函数直接根据数据容器内的数据进行排序(回顾sorted函数:http://t.csdnimg.cn/wjtZK,3.4排序功能)。
但是当数据容器内数据比较复杂时(例如列表嵌套),就需要按照指定的数据排序,如本文件,需要在同一年份里,按照GDP排序(升序),图中只展现前8个国家的GDP,sorted函数不再适用。我们可以使用sort函数,语法如下:
列表.sort(key=选择排序依据的函数, reverse=True|False)
- 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
- 参数reverse,是否反转排序结果,True表示降序,False表示升序
基础示例:
- #如下列嵌套列表,对外层列表进行排序,排序依据是内层列表的第二个元素(升序)
- list1=[['苹果',30],['香蕉',60],['橘子',50]]
- #定义排序规则
- def choose_sort_key(element):
- return element[1]
- #排序
- list1.sort(key=choose_sort_key,reverse=True)
- print(list1)
输出:
[['香蕉', 60], ['橘子', 50], ['苹果', 30]]
我们还可以使用 lambda匿名函数(回顾知识:http://t.csdnimg.cn/MRZnC,3.2 lambda匿名函数),写出更简洁的代码:
- #如下列嵌套列表,对外层列表进行排序,排序依据是内层列表的第二个元素(升序)
- list1=[['苹果',30],['香蕉',60],['橘子',50]]
- #定义排序规则
- def choose_sort_key(element):
- return element[1]
- #排序
- #list1.sort(key=choose_sort_key,reverse=True)
- list1.sort(key=lambda element:element[1],reverse=True)
- print(list1)
输出:
[['香蕉', 60], ['橘子', 50], ['苹果', 30]]
我们要处理一下文件“ 1960-2019全球GDP数据.csv ”中的数据,数据是csv格式,在使用open函数读取文件时要注意,编码格式不再是最常见的“ UTF-8 ”,而是“ GB2312 ”,我们可以在Notepad++界面的右下角看到(“ 1960-2019全球GDP数据.csv ”用记事本打开其编码格式不清晰,建议使用Notepad++):

文件开头的标题行需要删去。
绘制图表的步骤如下:
代码如下所示:
- #导包
- from pyecharts.charts import Bar,Timeline
- from pyecharts.globals import ThemeType
- from pyecharts.options import *
-
- #读取数据文件
- f=open('E:/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv','r',encoding='GB2312')
- lines=f.readlines() #按行获取文件内全部数据,返回一个列表,其中每一行的数据为一个元素
- #删除文件第一行数据
- lines.pop(0)
- #将数据转换为python字典,格式:{年份:[[国家, gdp], [国家,gdp],......],年份: [[国家, gdp],[国家,gdp],......],......}
- data_dict={}
- for line in lines: #lines是列表,每行数据为一个元素
- year=int(line.split(',')[0]) #每行数据为一个元素,比如‘1960,英国,73233967692’,需要切割,第一个是年份
- country=line.split(',')[1] #每行数据为一个元素,比如‘1960,英国,73233967692’,需要切割,第二个是国家名称
- gdp=float(line.split(',')[2]) #切割,第三个是GDP,GDP是数字,此处float用来避免科学计数法数据格式,保留数据原样
- try: #用异常处理控制字典新增元素,详解见代码下方
- data_dict[year].append((country,gdp)) #在对应的年份后追加元素[国家,gdp]
- except KeyError:
- data_dict[year]=[] #字典新增元素 year:列表
- data_dict[year].append((country, gdp))
- #准备时间线
- sorted_year_list=sorted(data_dict.keys())#对年份进行排序,从1960年开始,默认升序
- #创建时间线对象并设置主题
- timeline=Timeline({'theme':ThemeType.LIGHT})
- #timeline对象添加bar柱状图
- for year in sorted_year_list:
- data_dict[year].sort(key=lambda element:element[1],reverse=True)#每个年份内的“国家+GDP”数据按GDP排序(升序)
- year_data=data_dict[year][0:8] #排完序后取最高的前8位国家
- countrys=[] #用来保存X轴数据
- gdps=[] #用来保存Y轴数据
- for country_gdp in year_data:
- countrys.append(country_gdp[0])
- gdps.append(int(country_gdp[1]/100000000)) #GDP单位为亿
- #创建柱状图对象
- bar=Bar()
- countrys.reverse() #详解见代码下方
- gdps.reverse() #详解见代码下方
- #设置标题
- bar.set_global_opts(title_opts=TitleOpts(title=f'{year}年全球前8的GDP国际'))
- #添加X轴数据
- bar.add_xaxis(countrys)
- #添加Y轴数据
- bar.add_yaxis('GDP(亿)',gdps,label_opts=LabelOpts(position='right'))#标签在右侧
- #反转X轴和Y轴
- bar.reversal_axis() #得到横向的柱状图
- #timeline对象添加bar柱状图,即在时间线上添加点
- 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('GDP动态柱状图.html')
第二步中需要注意:

第三步中需要注意:
因为我们要得到横向的柱状图,且保持GDP高的国家在上方,原本的X轴,Y轴反转后,X轴,Y轴的数据也要跟着反转,如下例所示:

X轴,Y轴的数据也要跟着反转后:
