# 使用 bar() 绘制柱形图或堆积柱形图

# 使用pyplot 的 bar() 函数可以快速绘制柱形图或堆积柱形图。bar() 函数的语法格式如下所示 :

bar(x, height, width=0.8, bottom=None, align='center',
    data=None, tick__label=None, xerr=None, yerr=None,
    error_kw=None, **kwargs)

# 该函数常用参数的含义如下。

# · x :表示柱形的 x 坐标值。
· height :表示柱形的高度。
· width :表示柱形的宽度,默认为 0.8。
· bottom :表示柱形底部的 y 坐标值,默认为 0。
· align :表示柱形的对齐方式,有 'enterl' 和 'edge'两个取值,其中'center' 表示将柱形与刻度线居中对齐 ;'edge'表示将柱形的左边与刻度线对齐。
· tick_label :表示柱形对应的刻度标签。
· xerr, yerr :若未设为 None, 则需要为柱形图添加水平 / 垂直误差棒。
· error_kw :表示误差棒的属性字典,字典的键对应 errorbar() 函数 ( 2.10 节会介绍 ) 的关键字参数。

# bar() 函数会返回一个 BarContainer 类的对象。BarContainer 类的对象是一个包含矩形或误差棒的容器,它亦可以视为一个元组,可以遍历获取每个矩形条或误差棒。此外,BarContainer 类的对象也可以访问 patches 或 errorbar 属性,从而获取图表中所有的矩形条或误差棒。
例如,使用bar() 函数绘制柱形图,代码如下。

In [2]:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange (5)
y1 = np.array ( [10, 8, 7, 11, 13] )
# 柱形的宽度
bar_width = 0.3
# 绘制柱形图
plt.bar (x, y1, tick_label=[ 'a','b','d','e '] , width=bar_width)
plt.show ()

# 运行程序,效果如图 2-2 所示。

image

# 使用 pyplot 的 bar() 函数还可以绘制具有多组柱形的柱形图。例如,使用bar() 函数绘制一个具有两组柱形的柱形图,代码如下。

In [3]:
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 根据多组数据绘制柱形图
plt.bar (x, yl, tick_label=[ 'a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar (x+bar_width, y2, width=bar_width)
plt.show ()

# 运行程序,效果如图 2-3 所示。

image

# 在使用 pyplot 的 bar() 函数绘制图表时,可以通过给 bottom 参数传值的方式控制柱形的 y 值,使后绘制的柱形位于先绘制的柱形的上方。例如,使用 bar() 函数绘制由两组柱形堆叠而成的堆积柱形图,代码如下。

In [4]:
# 绘制堆积柱形图
plt.bar (x, y1, tick_label=[ 'a ', 'b‘, 'c', 'd‘, 'e'], width=bar_width)
plt.bar (x, y2, bottom=yl, width=bar_width)
plt.show ()

# 运行程序,效果如图 2-4 所示。

image

# 此外,在使用 pyplot 的 bar() 函数绘制图表时可以通过给 xerr、yerr 参数传值的方式为柱形添加误差棒,示例代码如下 :

In [5]:
# 偏差数据
error = [2, 1, 2.5, 2, 1.5]
# 绘制带有误差棒的柱形图
plt.bar (x, y1, tick_label=[ 'a ', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar (x, y1, bottom=y1, width=bar_width, yerr=error)
plt.show()

# 运行程序,效果如图 2-5 所示。

image

# 实例 2:2013—2019 财年某电商平台的 GMV

# 随着互联网与电子商务的快速发展,人们的消费模式发生了翻天覆地的变化,越来越多的消费者选择网络购物。据某公司的财务统计,2013—2019 财年该公司电商平台的 GMV( 一定时间内的成交总额 )如表 2-2 所示。

image

# 根据表 2-2 的数据,将“财年”这一列的数据作为 x 轴的刻度标签,将 GMV 这一列的数据作为 y 轴的数据,使用 bar() 函数绘制各年份对应的 GMV 的柱形图,具体代码如下。

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 8)
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])
# 绘制柱形图
plt.bar (x, y, tick_label=[ "FY2013", "FY2014", "FY2015”,
                        "FY2016”,"FY2017”,"FY2018”,"FY2019”], width=0.5)
plt.show ()

# 运行程序,效果如图 2-6 所示。

image

# 图 2-6中,x 轴代表财年,y 轴代表成交总额。由图 2-6 可知,2013-2019 财年的成交总额逐年增加。