3分钟

任务 4 绘制柱状图

任务目的

这一步会介绍柱状图的概念,柱状图的绘制流程以及相关参数。同时会通过一个常见食物热量的柱状图来展示具体的绘制流程。

任务步骤

1.柱状图介绍

(1)柱状图概述

柱形图,又称长条图、柱状统计图,通过使用水平或垂直方向柱子的高度来显示不同类别的数值(其中,水平方向的柱状图又被称为条形图),常用来比较两个或以上对象的价值。适合中小规模,单一变量的数据比较。

(2)柱状图的绘制流程

柱状图的绘制方法是matplotlib.pyplot.plot(),传递参数的形式与折线图类似,但区别在于折线图可以只传递y轴的参数,而柱状图必需同时传递x轴和y轴的参数

下方的代码绘制了一个简单的柱状图(需要先执行准备实验环境的操作),其中使用了与前面绘制折线图相同的数据:

plt.bar([1, 2, 3, 4], [1, 4, 9, 16])

其中,列表[1, 2, 3, 4]对应x轴的数据,列表[1, 4, 9, 16]对应y轴的值,两个列表中的数据个数需要保持一致。

执行代码后,就会生成一个简单的柱状图:

4-4-1 柱状图绘制示例

下面通过常见食物热量的示例,展示柱状图绘制的具体应用。

2.示例——使用柱状图展示常见食物热量

下面的代码对应了一个展示常见食物热量的柱状图,复制这些代码到文档的单元格中:

# 1.配置实验环境
%matplotlib inline
import matplotlib.pyplot as plt  # 导入pyplot模块
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False  # 解决正负号乱码问题

# 2.准备实验数据
name_list = ['核桃', '巧克力', '饼干', '奶酪', '鸭肉', '鸡蛋', '玉米', '香蕉', '豆腐', '苹果', '梨', '白菜', '黄瓜', '番茄']
calorie_list = [646, 589, 435, 328, 240, 144, 112, 93, 87, 53, 51, 20, 16, 15]

# 3.定义画布尺寸和分辨率
plt.figure(figsize=(12, 6), dpi=150)

# 4.绘制柱状图
x = range(len(name_list))
plt.xticks(x, name_list)
plt.bar(x, calorie_list, width=0.4, color=['#ffaa00' if i>300 else '#40c000' for i in calorie_list])

# 5.柱状图修饰
# 添加提示信息
plt.title("常见食物热量柱状图")  # 添加标题
plt.xlabel("食物名")  # 添加x轴标签
plt.ylabel("热量(单位:大卡/100克)")  # 添加y轴标签
# 添加网格
plt.grid(linestyle="--", alpha=0.2)

按下【Shift+Enter】运行单元格,将会展示常见食物的热量柱状图:

4-4-2 常见食物热量柱状图

绘制柱状图与折线图的流程基本一致。下面对本例中进行调整的部分参数进行说明:

为了突出各食物之间的热量差异,比例中适当调整了画布尺寸,使用了较小的宽高比(温度折线图示例中为4 : 1,本例中为2:1):

plt.figure(figsize=(12, 6), dpi=150)

绘制柱状图的代码如下:

x = range(len(name_list))
plt.xticks(x, name_list)  # 解决中文刻度展示问题
plt.bar(x, calorie_list, width=0.4, color=['#ffaa00' if i>300 else '#40c000' for i in calorie_list])

定义变量x及对应的处理是为了解决中文刻度展示的问题,如果直接使用中文定义坐标刻度,在部分环境下会抛出Type Error异常。

绘制柱状图的参数width=0.4手动设置了每根柱子的宽度(默认值为0.8,最大值为1),如果希望设置较大的宽度,可以适当增加宽度值。

注:在绘制柱状图时,要适当控制柱子的宽度和间隙,否则会影响数据的呈现效果,合理的范围是单格柱子的宽度不小于间隙的两倍。

如果希望所有数据展示同一种颜色,可以直接定义color参数的值为指定颜色;如果想分别设置每个对象的颜色,则需要指定color参数的值为一个列表,列表中的每个参数对应一个对象的颜色。本例中借助列表生成式,依次定义每种食物的颜色:

color=['#ffaa00' if i>300 else '#40c000' for i in calorie_list]

对于单位热量>300的食物,使用橙色(#ffaa00)显示,对于热量小于或等于300的食物,使用绿色(#40c000)来显示。

至此关于柱状图的介绍已经完成,下一步将会介绍饼状图的绘制。