综合案例-数据可视化-柱状图
一、基础柱状图
我们绘制一个关于三种水果销售额的柱状图,X轴数据为三种水果的名称,用列表['苹果','香蕉','橘子']添加进去,Y轴数据为三种水果的销售额,用列表[50,70,60]添加进去。
步骤:
- 导包
- 构建柱状图对象
- 添加X轴数据
- 生成地图
代码如下:
#导包
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
不同主题对应的颜色:
想了解更多柱状图的用法,请访问官网:DocumentDescriptionhttps://gallery.pyecharts.org/#/Bar/README
三、GDP动态柱状图
3.1列表排序
本节所用文件链接:
链接: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]]
3.2处理数据并生成图表
我们要处理一下文件“ 1960-2019全球GDP数据.csv ”中的数据,数据是csv格式,在使用open函数读取文件时要注意,编码格式不再是最常见的“ UTF-8 ”,而是“ GB2312 ”,我们可以在Notepad++界面的右下角看到(“ 1960-2019全球GDP数据.csv ”用记事本打开其编码格式不清晰,建议使用Notepad++):
文件开头的标题行需要删去。
绘制图表的步骤如下:
- 读取数据文件。
- 利用for循环将数据转换为python字典。
- 在时间线上添加点(每年的GDP柱状图)。
- 设置自动播放,生成图表。
代码如下所示:
#导包
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')
第二步中需要注意:
- 将数据转换为python字典,格式:{年份:[[国家, gdp],[国家,gdp],......],年份::[[国家,gdp],[国家,gdp],......],......},即年份为key,value内包含这一年所有国家的名称和GDP,value是列表类型,列表的元素类型为列表(嵌套),每个列表的内容:每个国家名称+对应的GDP。
- 一个年份key对应的value内是所有国家的名称和GDP的列表,在字典data_dict中追加元素时,每次追加一个元素[国家,gdp],我们需要判断这个年份是否已经存在,即添加这个年份的数据是否是第一次添加,因为年份“一年”才能添加一次,如果此次都添加年份,数据格式就会混乱。这个年份如果存在,直接追加元素[国家,gdp],如果不存在,先追加年份这个key,再去追加对应的value中的元素[国家,gdp]。
第三步中需要注意:
因为我们要得到横向的柱状图,且保持GDP高的国家在上方,原本的X轴,Y轴反转后,X轴,Y轴的数据也要跟着反转,如下例所示:
X轴,Y轴的数据也要跟着反转后: