# 绘制条形图或堆积条形图

# 使用 barh() 绘制条形图或堆积条形图

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

barh(y, width, height=0.8, left=None, align='center',*,
    **kwargs)

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

# · y :表示条形的 J 坐标值。
· width :表示条形的宽度,默认值为 0.8。
· height :表示条形的高度。
· left :条形左侧的 x 坐标,默认为 0。
· align :表示条形的对齐方式,有 'center',和 'edgd' 两个取值,其中 'center',表示将条形与刻度线居中对齐 ;'edge' 表示将条形的底边与刻度线对齐。

# barh()函数会返回一个 BarContainer 类的对象。
例如,使用 barh() 函数绘制条形图,代码如下。

In [7]:
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(5)
x1 = np.array ( [10, 8, 7, 11, 13] )
# 条形的高度
bar_height = 0.3
# 绘制条形图
plt.barh(y, x1, tick_label=[ 'a', 'b', 'c', 'd', 'e'],height=bar_height)
plt.show ()

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

image

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

In [8]:
y = np.arange(5)
x1 = np.array( [10, 8, 7, 11, 13] )
x2 = np.array ( [9, 6, 5, 10, 12] )
# 条形的高度
bar_height = 0.3
# 根据多组数据绘制条形图
plt.barh(y, x1, tick_label=[ 'a', 'b', 'c', 'd', 'e' ], height=bar_height)
plt.barh(y+bar_height, x2, height=bar_height)
plt.show ()

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

image

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

In [9]:
# 绘制堆积条形图
plt.barh(y, x1, tick__label=[ ' a' , 'b', 'c', 'd', 'e'],height=bar_height)
plt.barh(y, x2, left=x1, height=bar_height)
plt.show ()

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

image

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

In [10]:
# 偏差数据
error = [2, 1, 2.5, 2, 1.5]
# 绘制带有误差棒的条形图
plt.barh(y, x1, tick_label=[ 'a', 'b', 'c', 'd', 'e'], height=bar_height)
plt.barh(y, x2, left-x1, height=bar_height, xerr=error)
plt.show ()

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

image

# 实例 3:各商品种类的网购替代率

# 如今已进入信息时代,网络购物已经成为人们日常生活的一部分,改变着人们的消费模式和习惯,成为拉动居民消费的重要渠道。因此,研究网购消费对于研判经济形势、促进经济转型升级有着重要的意义。2018 年国家统计局北京调查总队从网购活跃的人群中抽取了 771 个样本,并根据这些样本测算用户网购替代率( 网购用户线上消费对线下消费的替代比率)的情况,具体如表 2-3 所示。

image

image

# 根据表 2-3 的数据,将“商品种类”一列的数据作为 y 轴的刻度标签,将“替代率”一列的数据作为 x 轴的数据,使用 barh() 函数绘制各商品种类的网购替代率的条形图,具体代码如下。

In [11]:
# 03_substitution_rate_online
import matplotlib.pyplot as plt
import numpy as np
# 显示中文
plt.rcParams ['font.sans-serif'] = ['SimHei']
plt.rcParams ['axes.unicode_minus'] = False
x = np.array ( [0.959, 0.951, 0.935, 0.924, 0.893,
                0.892, 0.865, 0.863, 0.860, 0.856,
                0.854, 0.835, 0.826, 0.816, 0.798,
                0.765, 0.763, 0.67])
y = np.arange (1, 19)
labels = ["家政、家教、保姆等生活服务","飞机票、火车票","家具","手机、手机配件",
        "计算机及其配套产品","汽车用品","通信充值、游戏充值","个人护理用品",
        "书报杂志及音像制品","餐饮、旅游、住宿","家用电器",
        "食品、饮料、烟酒、保健品","家庭日杂用品","保险、演出票务",
        "服装、鞋帽、家用纺织品","数码产品","其他商品和服务","工艺品、收藏品"]
# 绘制条形图
plt.barh(y, x, tick_label=labels, align="center", height=0.6)
plt.show ()

# 需要说明的是,matplotlib 默认不支持显示中文,由于条形图的刻度标签是中文文本,因此需要将系统的字体修改为 SimHei。关于字体的设置会在第 4 章进行详细介绍。
运行程序,效果如图 2-11 所示。
图 2-11 中,x 轴代表网购替代率,y 轴代表商品种类。由图 2-11 可知,工艺品、收藏品的网购替代率最低,家政、家教、保姆等生活服务的网购替代率最高。

image