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


    一、基础柱状图

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

    步骤

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

    代码如下:

    1. #导包
    2. from pyecharts.charts import Bar
    3. #构建柱状图对象
    4. bar=Bar()
    5. #添加X轴数据
    6. bar.add_xaxis(['苹果','香蕉','橘子'])
    7. #添加Y轴数据
    8. bar.add_yaxis('销售额',[50,70,60])
    9. #生成地图
    10. bar.render('基础柱状图.html')

    运行代码后,同文件目录下生成新文件“基础柱状图.html”,用Edge浏览器查看生成的图表。

    如果我们想要反转x和y轴,并让数值标签位于右侧

    1. #导包
    2. from pyecharts.charts import Bar
    3. from pyecharts.options import *
    4. #构建柱状图对象
    5. bar=Bar()
    6. #添加X轴数据
    7. bar.add_xaxis(['苹果','香蕉','橘子'])
    8. #添加Y轴数据
    9. bar.add_yaxis('销售额',[50,70,60],label_opts=LabelOpts(position='right'))#数值标签位于右侧
    10. #反转X轴Y轴
    11. bar.reversal_axis()
    12. #生成地图
    13. bar.render('基础柱状图.html')

    生成的图表:

    二、基础时间线柱状图

    Timeline()-时间线: 柱状图描述的是分类数据,回答的是每一个分类中有多少这个问题。柱状图很难动态的描述一个趋势性的数据,pyecharts为我们提供了一种解决方案——时间线。

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

    我们绘制一个表示3个月水果销售额的基础时间线柱状图:

    1. #导包
    2. from pyecharts.charts import Bar,Timeline
    3. from pyecharts.options import *
    4. #构建1月水果销售额柱状图
    5. bar1=Bar()
    6. bar1.add_xaxis(['苹果','香蕉','橘子'])
    7. bar1.add_yaxis('销售额',[50,70,60])
    8. bar1.reversal_axis()#反转X轴Y轴
    9. #构建2月水果销售额柱状图
    10. bar2=Bar()
    11. bar2.add_xaxis(['苹果','香蕉','橘子'])
    12. bar2.add_yaxis('销售额',[90,40,70])
    13. bar2.reversal_axis()#反转X轴Y轴
    14. #构建3月水果销售额柱状图
    15. bar3=Bar()
    16. bar3.add_xaxis(['苹果','香蕉','橘子'])
    17. bar3.add_yaxis('销售额',[30,50,80])
    18. bar3.reversal_axis()#反转X轴Y轴
    19. #创建时间线对象
    20. timeline=Timeline()
    21. #timeline对象添加bar柱状图
    22. timeline.add(bar1,'1月水果销售额')
    23. timeline.add(bar2,'2月水果销售额')
    24. timeline.add(bar3,'3月水果销售额')
    25. #生成图表
    26. timeline.render('基础时间线柱状图.html')

    生成的图表:

    除了手动点击时间线上的点来切换图表,我们还可以设置自动播放,设置主题(达到更美观的效果),代码如下:

    1. #构建1月水果销售额柱状图
    2. bar1=Bar()
    3. bar1.add_xaxis(['苹果','香蕉','橘子'])
    4. bar1.add_yaxis('销售额',[50,70,60])
    5. bar1.reversal_axis()#反转X轴Y轴
    6. #构建2月水果销售额柱状图
    7. bar2=Bar()
    8. bar2.add_xaxis(['苹果','香蕉','橘子'])
    9. bar2.add_yaxis('销售额',[90,40,70])
    10. bar2.reversal_axis()#反转X轴Y轴
    11. #构建3月水果销售额柱状图
    12. bar3=Bar()
    13. bar3.add_xaxis(['苹果','香蕉','橘子'])
    14. bar3.add_yaxis('销售额',[30,50,80])
    15. bar3.reversal_axis()#反转X轴Y轴
    16. #创建时间线对象
    17. timeline=Timeline(
    18. {'theme':ThemeType.ROMANTIC} #设置主题
    19. )
    20. #timeline对象添加bar柱状图
    21. timeline.add(bar1,'1月水果销售额')
    22. timeline.add(bar2,'2月水果销售额')
    23. timeline.add(bar3,'3月水果销售额')
    24. #设置自动播放
    25. timeline.add_schema(
    26. play_interval=1000, #自动播放的时间间隔,单位毫秒
    27. is_timeline_show=True, #是否在自动播放时显示时间线
    28. is_auto_play=True, #是否自动播放
    29. is_loop_play=True #是否循环自动播放
    30. )
    31. #生成图表
    32. 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表示升序

    基础示例:

    1. #如下列嵌套列表,对外层列表进行排序,排序依据是内层列表的第二个元素(升序)
    2. list1=[['苹果',30],['香蕉',60],['橘子',50]]
    3. #定义排序规则
    4. def choose_sort_key(element):
    5. return element[1]
    6. #排序
    7. list1.sort(key=choose_sort_key,reverse=True)
    8. print(list1)

    输出:

    [['香蕉', 60], ['橘子', 50], ['苹果', 30]]

    我们还可以使用 lambda匿名函数(回顾知识:http://t.csdnimg.cn/MRZnC,3.2 lambda匿名函数),写出更简洁的代码:

    1. #如下列嵌套列表,对外层列表进行排序,排序依据是内层列表的第二个元素(升序)
    2. list1=[['苹果',30],['香蕉',60],['橘子',50]]
    3. #定义排序规则
    4. def choose_sort_key(element):
    5. return element[1]
    6. #排序
    7. #list1.sort(key=choose_sort_key,reverse=True)
    8. list1.sort(key=lambda element:element[1],reverse=True)
    9. 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. 设置自动播放,生成图表。

    代码如下所示:

    1. #导包
    2. from pyecharts.charts import Bar,Timeline
    3. from pyecharts.globals import ThemeType
    4. from pyecharts.options import *
    5. #读取数据文件
    6. f=open('E:/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv','r',encoding='GB2312')
    7. lines=f.readlines() #按行获取文件内全部数据,返回一个列表,其中每一行的数据为一个元素
    8. #删除文件第一行数据
    9. lines.pop(0)
    10. #将数据转换为python字典,格式:{年份:[[国家, gdp], [国家,gdp],......],年份: [[国家, gdp],[国家,gdp],......],......}
    11. data_dict={}
    12. for line in lines: #lines是列表,每行数据为一个元素
    13. year=int(line.split(',')[0]) #每行数据为一个元素,比如‘1960,英国,73233967692’,需要切割,第一个是年份
    14. country=line.split(',')[1] #每行数据为一个元素,比如‘1960,英国,73233967692’,需要切割,第二个是国家名称
    15. gdp=float(line.split(',')[2]) #切割,第三个是GDP,GDP是数字,此处float用来避免科学计数法数据格式,保留数据原样
    16. try: #用异常处理控制字典新增元素,详解见代码下方
    17. data_dict[year].append((country,gdp)) #在对应的年份后追加元素[国家,gdp]
    18. except KeyError:
    19. data_dict[year]=[] #字典新增元素 year:列表
    20. data_dict[year].append((country, gdp))
    21. #准备时间线
    22. sorted_year_list=sorted(data_dict.keys())#对年份进行排序,从1960年开始,默认升序
    23. #创建时间线对象并设置主题
    24. timeline=Timeline({'theme':ThemeType.LIGHT})
    25. #timeline对象添加bar柱状图
    26. for year in sorted_year_list:
    27. data_dict[year].sort(key=lambda element:element[1],reverse=True)#每个年份内的“国家+GDP”数据按GDP排序(升序)
    28. year_data=data_dict[year][0:8] #排完序后取最高的前8位国家
    29. countrys=[] #用来保存X轴数据
    30. gdps=[] #用来保存Y轴数据
    31. for country_gdp in year_data:
    32. countrys.append(country_gdp[0])
    33. gdps.append(int(country_gdp[1]/100000000)) #GDP单位为亿
    34. #创建柱状图对象
    35. bar=Bar()
    36. countrys.reverse() #详解见代码下方
    37. gdps.reverse() #详解见代码下方
    38. #设置标题
    39. bar.set_global_opts(title_opts=TitleOpts(title=f'{year}年全球前8的GDP国际'))
    40. #添加X轴数据
    41. bar.add_xaxis(countrys)
    42. #添加Y轴数据
    43. bar.add_yaxis('GDP(亿)',gdps,label_opts=LabelOpts(position='right'))#标签在右侧
    44. #反转X轴和Y轴
    45. bar.reversal_axis() #得到横向的柱状图
    46. #timeline对象添加bar柱状图,即在时间线上添加点
    47. timeline.add(bar,str(year))
    48. #设置自动播放
    49. timeline.add_schema(
    50. play_interval=1000, #自动播放的时间间隔,单位毫秒
    51. is_timeline_show=True, #是否在自动播放时显示时间线
    52. is_auto_play=True, #是否自动播放
    53. is_loop_play=False #是否循环自动播放
    54. )
    55. #生成图表
    56. 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轴的数据也要跟着反转后:

  • 相关阅读:
    JavaScript——day1(JavaScript是什么?组成、输入语法等)
    动态规划算法
    基于Redis(SETNX)实现分布式锁,案例:解决高并发下的订单超卖,秒杀
    简单工厂和工厂方法模式
    刷题笔记24——完全二叉树的节点个数
    Vue | Vue.js 高级语法系列
    什么是开源?为什么要坚持开源?
    vue3+te项目正式开发
    【Java基础】- HttpURLConnection详解
    ARM day1
  • 原文地址:https://blog.csdn.net/my_heart_goon/article/details/142098366