当前位置: 首页 > article >正文

综合案例-数据可视化-柱状图

一、基础柱状图

我们绘制一个关于三种水果销售额的柱状图,X轴数据为三种水果的名称,用列表['苹果','香蕉','橘子']添加进去,Y轴数据为三种水果的销售额,用列表[50,70,60]添加进去。

步骤

  1. 导包
  2. 构建柱状图对象
  3. 添加X轴数据
  4. 生成地图

代码如下:

#导包
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

不同主题对应的颜色:

想了解更多柱状图的用法,请访问官网:DocumentDescriptionicon-default.png?t=O83Ahttps://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++):

文件开头的标题行需要删去。

绘制图表的步骤如下:

  1. 读取数据文件。
  2. 利用for循环将数据转换为python字典。
  3. 在时间线上添加点(每年的GDP柱状图)。
  4. 设置自动播放,生成图表。

代码如下所示:

#导包
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],......],......},即年份为keyvalue内包含这一年所有国家的名称和GDP,value是列表类型,列表的元素类型为列表(嵌套),每个列表的内容:每个国家名称+对应的GDP。
  • 一个年份key对应的value内是所有国家的名称和GDP的列表,在字典data_dict中追加元素时,每次追加一个元素[国家,gdp],我们需要判断这个年份是否已经存在,即添加这个年份的数据是否是第一次添加,因为年份“一年”才能添加一次,如果此次都添加年份,数据格式就会混乱。这个年份如果存在,直接追加元素[国家,gdp],如果不存在,先追加年份这个key,再去追加对应的value中的元素[国家,gdp]。

第三步中需要注意:

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

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


http://www.kler.cn/a/306420.html

相关文章:

  • fastadmin多个表crud连表操作步骤
  • SpringBoot(十八)SpringBoot集成Minio
  • Servlet入门 Servlet生命周期 Servlet体系结构
  • 【机器学习】如何配置anaconda环境(无脑版)
  • Python 连接 Redis 进行增删改查(CRUD)操作
  • INQUIRE:一个包含五百万张自然世界图像,涵盖10,000个不同物种的专为专家级文本到图像检索任务设计的新型基准数据集。
  • python 读取excel数据存储到mysql
  • JVM 运行时数据区域
  • Amazon EC2:引领企业迈向云计算的未来
  • Lua 拷贝
  • 本地调试spark,访问kerberos鉴权的hdfs、hive
  • SOEX解锁Web3社交软件的无限可能
  • strncpy函数的使用和模拟实现
  • 远程Linux网络连接( Linux 网络操作系统 04)
  • Flutter启动无法运行热重载
  • 动态库相关知识解析
  • 教育培训小程序开发,简单实用的入门指南
  • GO 匿名函数
  • 【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法③】
  • 【解决方案】实验室管理系统(lims)整体解决方案设计书(word原件)
  • 探索Python轻量级数据库:TinyDB的奇妙之旅
  • QT Mode/View之View
  • CyclicBarrier的源码分析
  • 34. MyBatis如何处理SQL注入问题?有哪些防范措施?
  • 基于http请求的一种安全校验认证方案记录
  • 【C++】缺省(默认)参数