欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!
前言
在大数据时代,数据可视化成为了分析和展示数据的重要手段。在众多数据可视化形式中,柱状图以其直观性和易读性而广受欢迎。本章基于案例分析详细讲解了柱状图的不同类型,包括基础柱状图以及动态柱状图。
本篇文章参考:黑马程序员
一、基础柱状图
①基本流程
- 导入必要的模块:
- 创建柱状图对象
- 添加x轴数据
- 添加x轴数据
- 设置全局选项
- 渲染或生成图像
②常见方法
Method | Function | Example |
---|---|---|
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()常用语法:
Method | Function | Example |
---|---|---|
__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
解题思路:
- 需求分析
- 处理数据
- 列表排序
- 准备时间线
- 自动播放和绘图
【知识补充】
在前面我们学习过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
文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。