前言
在大数据时代,数据可视化成为了分析和展示数据的重要手段。在众多数据可视化形式中,柱状图以其直观性和易读性而广受欢迎。本章基于案例分析详细讲解了柱状图的不同类型,包括基础柱状图以及动态柱状图。
本篇文章参考:黑马程序员
一、基础柱状图
①基本流程
导入必要的模块: 创建柱状图对象
添加x轴数据 添加x轴数据 设置全局选项 渲染或生成图像
②常见方法
Method | Function | Example |
---|---|---|
| 设置 x 轴的数据 |
|
| 添加 y 轴的数据 |
|
| 设置全局配置选项 |
|
| 设置系列特定配置 |
|
| 渲染图表并保存为 HTML 文件 |
|
| 设置图表中柱子的颜色 |
|
| 反转轴 |
|
| 自定义 tooltip 的显示方式 |
|
| 自定义图例 |
|
| 将多个系列重叠显示 |
|
| 添加数据缩放控件 |
|
| 导出快照 |
|
绘制垂直柱状图:
代码语言:python代码运行次数:0复制# 导包
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()常用语法:
Method | Function | Example |
---|---|---|
| 初始化时间线对象 |
|
| 向时间线添加图表 |
|
| 添加时间线的基本配置 |
|
| 设置全局选项 |
|
| 渲染图表并保存为HTML文件 |
|
| 设置系列图表的选项 |
|
| 设置时间线的颜色 |
|
| 设置工具提示 |
|
| 清空时间线中的所有图表 |
|
# 导包
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": 时间线主题})
例如:
代码语言:python代码运行次数:0复制# 构建时间线对象并进行主题设置
timeline = Timeline({"theme": ThemeType.LIGHT})
常用时间线主题:
代码语言:python代码运行次数:0复制# 导包
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
解题思路:
需求分析
处理数据
列表排序
准备时间线
自动播放和绘图
【知识补充】
在前面我们学习过sorted()
函数,可以对数据容器进行排序。而在该案例中,我们需要对列表进行排序,并指定排序规则,但sorted()
函数无法完成该任务。这时我们需要补充学习列表的sort()
方法。
①基本语法
列表.sort(key=选择排序依据的函数, reverse=True|False)
- 参数key:要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
- 参数reverse:是否反转排序结果,True表示降序,False表示升序
②书写方式
写法一:基于带名函数
代码语言:python代码运行次数:0复制# 准备列表
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函数相关知识点见 Python函数进阶这篇文章。
代码语言:python代码运行次数:0复制# 准备列表
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]
例题代码:
代码语言:python代码运行次数:0复制# 导包
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
文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。