Chapter 24 数据可视化——柱状图

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!


前言

在大数据时代,数据可视化成为了分析和展示数据的重要手段。在众多数据可视化形式中,柱状图以其直观性和易读性而广受欢迎。本章基于案例分析详细讲解了柱状图的不同类型,包括基础柱状图以及动态柱状图。


本篇文章参考:黑马程序员

一、基础柱状图

①基本流程

  1. 导入必要的模块:
  2. 创建柱状图对象
  3. 添加x轴数据
  4. 添加x轴数据
  5. 设置全局选项
  6. 渲染或生成图像

②常见方法

MethodFunctionExample
add_xaxis()设置 x 轴的数据bar.add_xaxis(["A", "B", "C", "D"])
add_yaxis()添加 y 轴的数据bar.add_yaxis("系列名称", [10, 20, 30, 40])
set_global_opts()设置全局配置选项bar.set_global_opts(title_opts=opts.TitleOpts(title="图表标题"))
set_series_opts()设置系列特定配置bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
render()渲染图表并保存为 HTML 文件bar.render("chart.html")
set_colors()设置图表中柱子的颜色bar.set_colors(['#d48265', '#91c7ae'])
reversal_axis()反转轴bar.reversal_axis()
set_tooltip()自定义 tooltip 的显示方式bar.set_global_opts(tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"))
set_legends()自定义图例bar.set_series_opts(label_opts=opts.LabelOpts(position="top"))
overlap()将多个系列重叠显示bar1.overlap(bar2)
datazoom()添加数据缩放控件bar.set_global_opts(datazoom_opts=[opts.DataZoomOpts()])
export_snapshot()导出快照bar.export_snapshot("snapshot.png")

绘制垂直柱状图:

# 导包
from pyecharts.charts import Bar
# 使用Bar构建基础柱状图
bar=Bar()
# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
bar.add_yaxis("GDP",["30","20","10"])
# 绘图
bar.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。
在这里插入图片描述
绘制水平柱状图:
通过reversal_axis()方法反转x轴和y轴。

# 导包
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts
# 使用Bar构建基础柱状图
bar=Bar()
# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar.reversal_axis()
# 绘图
bar.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。
在这里插入图片描述

二、动态柱状图

①创建时间线
柱状图主要用于描述分类数据,回答的是每个分类中『有多少?』这个问题,这是柱状图的主要特点。但是柱状图很难动态地描述一个趋势性的数据,这里pyecharts为我们提供了一种解决方案——时间线
如果说一个Bar或者Line对象是一张图表的话,那时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象。通过时间线,我们能够直观地展示随时间变化的数据趋势,使得数据的变化和发展过程一目了然。
在这里插入图片描述

方法:
timeline = Timeline()

Timeline()常用语法:

MethodFunctionExample
__init__()初始化时间线对象timeline = Timeline()
add()向时间线添加图表timeline.add(chart, time)
add_schema()添加时间线的基本配置timeline.add_schema(play_interval=1000)
set_global_opts()设置全局选项timeline.set_global_opts(title_opts=opts.TitleOpts(title="时间线示例"))
render()渲染图表并保存为HTML文件timeline.render("timeline.html")
set_series_opts()设置系列图表的选项timeline.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
set_colors()设置时间线的颜色timeline.set_colors(["#ff0000", "#00ff00"])
set_tooltip()设置工具提示timeline.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
clear()清空时间线中的所有图表timeline.clear()
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
# 使用Bar构建柱状图
bar1=Bar()
# 添加x轴数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar1.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar1.reversal_axis()

bar2=Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",["50","30","30"],label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3=Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",["60","50","40"],label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

# 构建时间线对象
timeline=Timeline()
# 在时间线对象内添加柱状图对象
timeline.add(bar1,"点1")
timeline.add(bar2,"点2")
timeline.add(bar3,"点3")

# 绘图(通过时间线对象绘图)
timeline.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。
点1对应的柱状图:
在这里插入图片描述
点2对应的柱状图:
在这里插入图片描述
点3对应的柱状图:
在这里插入图片描述
②自动播放
可通过add_schema()方法添加时间线的基本配置,如是否自动播放、是否循坏播放、是否显示时间线等 。

# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
# 使用Bar构建柱状图
bar1=Bar()
# 添加x轴数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar1.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar1.reversal_axis()

bar2=Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",["50","30","30"],label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3=Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",["60","50","40"],label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

# 构建时间线对象
timeline=Timeline()
# 在时间线对象内添加柱状图对象
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()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。每隔1000ms会轮换一张柱状图。
在这里插入图片描述
③时间线主题设置
在pyecharts中,我们可以通过主题设置来更改图表的外观。

基本语法:
timeline = Timeline({“theme”: 时间线主题})

例如:

# 构建时间线对象并进行主题设置
timeline = Timeline({"theme": ThemeType.LIGHT})

常用时间线主题:
在这里插入图片描述

# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType
# 使用Bar构建柱状图
bar1=Bar()
# 添加x轴数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar1.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar1.reversal_axis()

bar2=Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",["50","30","30"],label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3=Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",["60","50","40"],label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

# 构建时间线对象并进行主题设置
timeline = Timeline({"theme": ThemeType.LIGHT})
# 在时间线对象内添加柱状图对象
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()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。
在这里插入图片描述

三、案例分析

【案例——GDP动态柱状图】
1960-2019全球GDP数据.csv文本文件存储了2021年08月18日中国各省份疫情相关数据,请根据该数据绘制1960-2019年全球GDP排名前八的动态柱状图。
在这里插入图片描述
要求实现如下效果:
1.GDP数据处理为亿级
2.有时间轴,按照年份为时间轴的点
3.x轴和y轴反转,同时每一年的数据只要前8名国家
4.有标题,标题的年份会动态更改
5.设置了主题为LIGHT
在这里插入图片描述

解题思路:

  1. 需求分析
  2. 处理数据
  3. 列表排序
  4. 准备时间线
  5. 自动播放和绘图

【知识补充】
在前面我们学习过sorted()函数,可以对数据容器进行排序。而在该案例中,我们需要对列表进行排序,并指定排序规则,但sorted()函数无法完成该任务。这时我们需要补充学习列表的sort()方法。

①基本语法
列表.sort(key=选择排序依据的函数, reverse=True|False)

  • 参数key:要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
  • 参数reverse:是否反转排序结果,True表示降序,False表示升序

②书写方式
写法一:基于带名函数

# 准备列表
my_list=[["a",33],["b",55],["c",11]]

# 排序(基于带名函数)
def choose_sort_key(element):
return element[1]

my_list.sort(key=choose_sort_key,reverse=True)
print(my_list)

输出结果:
[[‘b’, 55], [‘a’, 33], [‘c’, 11]]

写法二:基于lambda函数
lambda函数相关知识点见Chapter 15 Python函数进阶这篇文章。

# 准备列表
my_list=[["a",33],["b",55],["c",11]]

# 排序(基于lambda函数)
my_list.sort(key=lambda element:element[1],reverse=True)
print(my_list)

输出结果:
[[‘b’, 55], [‘a’, 33], [‘c’, 11]]

例题代码:

# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts,TitleOpts
from pyecharts.globals import ThemeType

# 读取数据
# GB2312是针对简体中文字符集的编码,适用于处理中文文本
f=open("D:/1960-2019全球GDP数据.csv","r",encoding="GB2312")
data_lines=f.readlines()
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储
# 格式为:{年份:[国家,gdp],[国家,gdp],……}
data_dict={}
for line in data_lines:
    year=int(line.split(",")[0])   #得到年份
    country=line.split(",")[1]   #得到国家
    # 通过float将科学计数法表示的GDP值转换为正常的浮点数
    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]))
# print(data_dict)   可以打印出来观察数据,方便理解
#输出数据:{1960: [['美国', 543000000000.0], ['英国', 73233967692.0],……],2019: [['美国', 21400000000000.0], ['中国', 14300000000000.0],……]}

# 排序年份
sorted_year_list=sorted(data_dict.keys())
# print(sorted_year_list)   可以打印出来观察数据,方便理解
#输出数据:[1960, 1961, 1962, ……]

# 创建时间线对象并设置主题
timeline=Timeline({"theme":ThemeType.LIGHT})

# 排序每个年份各国的GDP
for year in sorted_year_list:
    data_dict[year].sort(key=lambda element:element[1],reverse=True)
    # 取出本年份GDP前8名的国家
    year_data=data_dict[year][0:8]
    # print(year_data)   可以打印出来观察数据,方便理解
    """
    输出结果:
    [['美国', 543000000000.0], ['英国', 73233967692.0], ['法国', 62225478000.0], ['中国', 59716467625.0], ['日本', 44307342950.0], ['加拿大', 40461721692.0], ['意大利', 40385288344.0], ['印度', 37029883875.0]]
    [['美国', 563000000000.0], ['英国', 77741965703.0], ['法国', 67461644222.0], ['日本', 53508617739.0], ['中国', 50056868957.0], ['意大利', 44842760293.0], ['加拿大', 40934952063.0], ['印度', 39232435784.0]]
    [['美国', 605000000000.0], ['英国', 81247564156.0], ['法国', 75607529809.0], ['日本', 60723018683.0], ['意大利', 50383891898.0], ['中国', 47209359005.0], ['加拿大', 42227447631.0], ['印度', 42161481858.0]]
    [['美国', 639000000000.0], ['英国', 86561961812.0], ['法国', 84759195105.0], ['日本', 69498131797.0], ['意大利', 57710743059.0], ['中国', 50706799902.0], ['印度', 48421923458.0], ['加拿大', 45029988561.0]]
    ……
    """

    x_data=[]
    y_data=[]
    # for循坏每一年的数据,基于每一年的数据,创建每一年的bar对象
    for country_gdp in year_data:
        x_data.append(country_gdp[0])   # x轴添加国家
        y_data.append(country_gdp[1])   # y轴添加GDP数据

    # 构建柱状图
    bar=Bar()
    x_data.reverse()
    y_data.reverse()
    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}年全球排名前八GDP数据")
    )

    # 将每一年的bar对象添加到时间线中
    # str(year): 将年份转换为字符串,以确保它可以正确地与 bar 关联
    timeline.add(bar,str(year))

# 设置时间线自动播放
timeline.add_schema(
# 自动播放的时间间隔,单位为毫秒
    play_interval=1000,
    # 是否显示时间线
    is_timeline_show=True,
    # 是否自动播放
    is_auto_play=True,
    # 是否循坏播放
    is_loop_play=True
)
# 绘图
timeline.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。
请添加图片描述
请添加图片描述

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值