# Python 数据分析三剑客之 Matplotlib（六）：直方图/柱状图/条形图的绘制

TRHX

2020-04-21

Python 数据分析 / Matplotlib

字数统计:

5,924字

阅读时长≈

26分

Matplotlib 系列文章：

- Python 数据分析三剑客之 Matplotlib（一）：初识 Matplotlib 与其 matplotibrc 配置文件
- Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性
- Python 数据分析三剑客之 Matplotlib（三）：图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性
- Python 数据分析三剑客之 Matplotlib（四）：线性图的绘制
- Python 数据分析三剑客之 Matplotlib（五）：散点图的绘制
- Python 数据分析三剑客之 Matplotlib（六）：直方图 / 柱状图 / 条形图的绘制
- Python 数据分析三剑客之 Matplotlib（七）：饼状图的绘制
- Python 数据分析三剑客之 Matplotlib（八）：等高线 / 等值线图的绘制
- Python 数据分析三剑客之 Matplotlib（九）：极区图 / 极坐标图 / 雷达图的绘制
- Python 数据分析三剑客之 Matplotlib（十）：3D 图的绘制
- Python 数据分析三剑客之 Matplotlib（十一）：最热门最常用的 50 个图表【译文】

专栏：

【NumPy 专栏】【Pandas 专栏】【Matplotlib 专栏】

推荐学习资料与网站：

【NumPy 中文网】【Pandas 中文网】【Matplotlib 中文网】【NumPy、Matplotlib、Pandas 速查表】

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/105952856
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

## 【1x00】直方图 / 柱状图 / 条形图的区别

- 直方图：直方图（Histogram）又称质量分布图，是一种统计报告图，由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用于描述连续型数据的分布关系，用横轴表示数据类型，纵轴表示分布情况。直方图是用面积表示各组频数的多少，矩形的高度表示每一组的频数或频率，宽度则表示各组的组距，因此其高度与宽度均有意义。其次，由于分组数据具有连续性，直方图的各矩形通常是连续排列。

- 柱状图：柱状图（bar chart）又称条图、长条图、柱状统计图、条状图、棒形图，是一种以长方形的长度为变量的统计图表。一般用于描述离散型分类数据的对比，长条图用来比较两个或以上的价值（不同时间或者不同条件），只有一个变量，通常利用于较小的数据集分析。柱状图亦可横向排列，或用多维方式表达。柱状图各矩形的宽度固定，矩形之间分开排列，会有间距。

- 条形图：通常情况下条形图 = 柱状图，也可以将横向排列的柱状图称为条形图。在本文中会将条形图视为后者。

## 【2x00】直方图的绘制

### 【2x01】函数介绍 matplotlib.pyplot.hist()

`matplotlib.pyplot.hist()` 函数用于绘制直方图。

基本语法：`matplotlib.pyplot.hist(x[, bins=None, range=None, density=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, \*\*kwargs])`

基本参数：

参数 | 描述
--- | ---
x | 数据集，数组或数组序列
bins | 统计的分布区间、条形数，可以是整数、序列或字符串，默认 `rcParams["hist.bins"] =10` 如果 bins 是整数，则定义的是等宽的矩形的个数 如果 bins 是序列，则定义的是每个矩形的区间，如：`bins = [1, 2, 3, 4]`，则矩形分布区间为 `[1,2)`、`[2,3)`、`[3,4]` 如果 bins 是字符串，则它应该是 numpy.histogram_bin_edges 所支持的策略之一
range | 矩形分布的区间，在没有指定 bins 生效，元组类型
density | 是否显示频率统计结果，`频率统计结果=区间数目/(总数*区间宽度)`
bottom | y 轴的起始位置，默认为 0
histtype | 矩形的样式，有四种类型可选： `'bar'`：默认值，传统的条形直方图，如果给出多个数据，则条形图并排排列 `'barstacked'`：当数据为 1 个时，和 bar 结果一样，当数据为多个时，则进行垂直堆叠 `'step'`：未填充的线条形式；`'stepfilled'`：填充的线条形式，效果与 bar 差不多
align | 矩形的中心位于 bins（x 轴） 的位置，`'left'`：左；`'mid'`：中；`'right'`：右
orientation | 矩形的方向，`vertical`：垂直；`horizontal`：水平
rwidth | 矩形的相对宽度，如果未指定，则自动计算宽度
log | y 坐标轴是否以指数刻度显示
color | 矩形的颜色，默认蓝色，与 facecolor 作用相同，指定一个即可，如果两者都指定，则取 facecolor 的值
label | 数据的标签，展示图例时使用
stacked | 是否为堆积状图（当两个数据相似时，堆积在一起就会把第一个数据的显示相对缩小一点）

其他参数：

参数 | 描述
--- | ---
facecolor | 标量或数组类型，每个矩形的颜色，与 color 作用相同，指定一个即可，如果两者都指定，则取 facecolor 的值
edgecolor | 标量或数组类型，直方图边缘线的颜色
linewidth | 标量或数组类型，直方图边缘线的宽度，如果为 0，则不绘制边
alpha | float 类型，矩形透明度
label | 图例中显示的标签
linestyle / ls | 线条样式，此处指矩形边缘线条样式 `'-'` or `'solid'`, `'--'` or `'dashed'`, `'-.'` or `'dashdot'` or `':'` or `'dotted'`, `'none'` or `' '` or `''`
linewidth / lw | 线条宽度，此处指矩形边缘线的宽度，float 类型，默认 0.8
hatch | 矩形的填充图案，可以是组合形式，如果有相同的图案，则会增加填充的密度 取值可以是：`'/'`, `'\'`, `’ | ‘`,`‘-‘`,`‘+’`,`‘x’`,`‘o’`,`‘O’`,`‘.’`,`‘*’`

### 【2x02】简单直方图示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 设置中文显示

    x = np.random.randint(0, 101, 100)  # 数据集
    bins = np.arange(0, 101, 10)        # 分布区间 [0,10)、[10,20)...[90,100]

    plt.hist(x, bins=bins, linewidth=0.5, edgecolor='k')  # 边缘线宽0.5，颜色为黑色
    plt.xlim(0, 100)                    # x 轴刻度范围
    plt.title('简单直方图示例')         # 标题
    plt.xlabel('x axis label')         # x 轴标签
    plt.ylabel('y axis label')         # y 轴标签

    plt.show()

<fancybox>
</fancybox>

### 【2x03】堆积的直方图

参数 `stacked` 决定了将两份数据进行堆积显示。注意，有可能两个数据相似（y 轴的值相似），但是堆积在一起的时候，会把第一个数据的显示相对缩小一点。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    import matplotlib.pyplot as plt
    import numpy as np

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    hist1 = np.random.randint(0, 100, 100)
    hist2 = np.random.randint(0, 100, 100)
    x = [hist1, hist2]
    colors = ['orchid', 'deepskyblue']
    labels = ['hist1', 'hist2']
    bins = range(0, 101, 10)

    # 绘制两份数据的直方图，数据集等其他参数可以使用列表形式传递，也可以使用两次 hist 函数单独传递
    plt.hist(x, bins=bins, color=colors, stacked=True, label=labels)
    plt.title('堆积的直方图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend(loc="upper left")

    plt.show()

<fancybox>
</fancybox>

### 【2x04】填充其他样式

`hatch` 参数可以让直方图的矩形填充其他样式，可选值有：`'/'`, `'\'`, `'|'`, `'-'`, `'+'`, `'x'`, `'o'`, `'O'`, `'.'`, `'*'`。可以是不同图案的组合形式，如果有相同的图案，则会增加填充的密度。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 设置中文显示

    x = np.random.randint(0, 101, 100)  # 数据集
    bins = np.arange(0, 101, 10)        # 分布区间 [0,10)、[10,20)...[90,100]

    # 矩形颜色为白色，使用 / 填充，边缘线宽0.5，颜色为黑色
    plt.hist(x, bins=bins, color='w', hatch='///', linewidth=0.5, edgecolor='k')
    plt.xlim(0, 100)                   # x 轴刻度范围
    plt.title('直方图图案填充示例')     # 标题
    plt.xlabel('x axis label')         # x 轴标签
    plt.ylabel('y axis label')         # y 轴标签

    plt.show()

<fancybox>
</fancybox>

## 【3x00】柱状图的绘制

### 【3x01】函数介绍 matplotlib.pyplot.bar()

`matplotlib.pyplot.bar()` 函数用于绘制柱状图。

基本语法：`matplotlib.pyplot.bar(x, height[, width=0.8, bottom=None, align='center', \*\*kwargs])`

基本参数：

参数 | 描述
--- | ---
x | 标量序列，每个矩形对应的 x 轴刻度
height | 标量或标量序列，每个矩形对应的高度，即 y 轴刻度
width | 标量或数组类型，每个矩形的宽度，默认为 0.8
bottom | 标量或数组类型，y 轴的起始位置，默认为 0
align | 矩形与 x 轴刻度对齐的位置，`'center'`：中；`'edge'`：左边缘

其他参数：

参数 | 描述
--- | ---
color | 标量或数组类型，每个矩形的颜色，与 facecolor 作用相同，指定一个即可，如果两者都指定，则取 facecolor 的值
edgecolor | 标量或数组类型，柱状图边缘线的颜色
linewidth | 标量或数组类型，柱状图边缘线的宽度，如果为0，则不绘制边
tick_label | 标量或数组类型，柱状图 x 轴的刻度标签，默认使用数字标签
xerr / yerr | 标量，指定对应标准差（添加误差线时会用到）
ecolor | 标量或数组类型，误差线的线条颜色，默认值为 black
capsize | 标量，误差线两头横线的宽度，默认为 `rcParams["errorbar.capsize"] = 0.0`
error_kw | 字典类型，可以此字典中定义 ecolor 和 capsize，比单独指定的优先级要高
log | bool 值，y 坐标轴是否以指数刻度显示
alpha | float 类型，矩形透明度
label | 图例中显示的标签
linestyle / ls | 线条样式，此处指矩形边缘线条样式 `'-'` or `'solid'`, `'--'` or `'dashed'`, `'-.'` or `'dashdot'` or `':'` or `'dotted'`, `'none'` or `' '` or `''`
linewidth / lw | 线条宽度，此处指矩形边缘线的宽度，float 类型，默认 0.8
hatch | 矩形的填充图案，可以是组合形式，如果有相同的图案，则会增加填充的密度 取值可以是：`'/'`, `'\'`, `’ | ‘`,`‘-‘`,`‘+’`,`‘x’`,`‘o’`,`‘O’`,`‘.’`,`‘*’`

### 【3x02】简单柱状图示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = [1, 2, 3, 4, 5]
    height = [5, 7, 4, 3, 1]

    # 设置 x 轴的标签，也可以用 plt.xticks 方法来设置
    tick_label = ['A', 'B', 'C', 'D', 'E']
    # 设置颜色序列
    color = ['red', 'yellow', 'peru', 'orchid', 'deepskyblue']
    # 绘制柱状图，边缘线宽度为1，颜色为黑色，样式为 --
    plt.bar(x, height, tick_label=tick_label, color=color, edgecolor='k', linewidth=1, linestyle='--')

    plt.title('简单柱状图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

### 【3x03】添加与标准差的误差线

首先定义一个列表，其中的元素是与每个值对应的标准差，`ecolor` 和 `capsize` 参数分别指定误差线的颜色和两头横线的宽度。这两个参数可以通过 `error_kw` 字典形式组合起来。以字典形式的组合优先级别要比单独指定高。另外，柱状图指定标准差时要用 `yerr`，条形图（横向排列的柱状图）指定标准差时要用 `xerr`。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = [1, 2, 3, 4, 5]
    height = [5, 7, 4, 3, 2]
    std = [0.5, 0.1, 1.2, 0.3, 1.0]   # 标准差

    tick_label = ['A', 'B', 'C', 'D', 'E']  # 设置 x 轴的标签，也可以用 plt.xticks 方法来设置
    color = ['red', 'yellow', 'peru', 'orchid', 'deepskyblue']  # 设置颜色序列
    plt.bar(
        x,
        height,
        tick_label=tick_label,
        color=color,
        yerr=std,              # 指定对应标准差
        # error_kw={
        #     'ecolor': 'k',   # 指定误差线的颜色
        #     'capsize': 6     # 指定误差线两头横线的宽度
        # },
        ecolor='k',
        capsize=6,
        edgecolor='k',         # 指定边缘线颜色
        linewidth=1            # 指定边缘线宽度
    )

    plt.title('柱状图添加误差线示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

### 【3x04】多序列柱状图

在绘制多序列的柱状图时，只需要多次调用 `matplotlib.pyplot.bar()` 函数即可，指定一个较小的宽度值（偏移量），绘制不同数据时设置不同的 x 位置刻度即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(5)
    height1 = np.array([5, 7, 4, 3, 2])
    height2 = np.array([2, 4, 6, 7, 3])
    height3 = np.array([3, 1, 7, 5, 2])

    # 设置宽度值（偏移量）
    width = 0.3
    # 绘制不同数据时，x 轴依次增加一个偏移量
    plt.bar(x, height1, width, label='bar1')
    plt.bar(x + width, height2, width, label='bar2')
    plt.bar(x + width * 2, height3, width, label='bar3')

    # 设置 x 轴刻度的标签
    plt.xticks(x + width, ['A', 'B', 'C', 'D', 'E'])
    plt.title('多序列柱状图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

### 【3x05】堆积的柱状图

所谓堆积图，就是将多序列数据堆积到一个矩形上显示，在柱状图中要实现堆积图，只需要改变 `bottom` 参数即可，`bottom` 参数用于设置 y 轴基线，即柱状图的底边在 y 轴上的起始刻度，第一条数据 `data1` 的基线可以设置为 0，即默认值，第二条数据 `data2` 的基线可以设置在 `data1` 的上方，即 `bottom=data1`，第三条数据 `data3` 的基线可以设置在 `data1 + data2` 的上方，即 `bottom=data1+data2`，以此类推。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(5)
    height1 = np.array([5, 7, 4, 3, 2])
    height2 = np.array([2, 4, 6, 7, 3])
    height3 = np.array([3, 1, 7, 5, 2])

    plt.bar(x, height1, label='bar1')
    plt.bar(x, height2, label='bar2', bottom=height1)
    plt.bar(x, height3, label='bar3', bottom=(height2+height1))

    plt.xticks(x, ['A', 'B', 'C', 'D', 'E'])
    plt.title('堆积的柱状图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

### 【3x06】填充其他样式

`hatch` 参数可以让柱状图的矩形填充其他样式，可选值有：`'/'`, `'\'`, `'|'`, `'-'`, `'+'`, `'x'`, `'o'`, `'O'`, `'.'`, `'*'`。可以是不同图案的组合形式，如果有相同的图案，则会增加填充的密度。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(5)
    height1 = np.array([5, 7, 4, 3, 2])
    height2 = np.array([2, 4, 6, 7, 3])
    height3 = np.array([3, 1, 7, 5, 2])

    plt.bar(x, height1, label='bar1', color='w', hatch='///')
    plt.bar(x, height2, label='bar2', bottom=height1, color='w', hatch='xxx')
    plt.bar(x, height3, label='bar3', bottom=(height2+height1), color='w', hatch='|||')

    plt.xticks(x, ['A', 'B', 'C', 'D', 'E'])
    plt.title('柱状图图案填充示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

### 【3x07】添加文字描述

利用 `matplotlib.pyplot.text()` 方法可以在柱状图每个矩形上方添加文字描述。具体参数解释可参考前面的文章：《Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性》

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(5)
    height1 = np.array([5, 7, 4, 3, 2])
    height2 = np.array([2, 4, 6, 7, 3])
    height3 = np.array([3, 1, 7, 5, 2])

    width = 0.3
    # 绘制不同数据时，x 轴依次增加一个偏移量
    plt.bar(x, height1, width, label='bar1')
    plt.bar(x + width, height2, width, label='bar2')
    plt.bar(x + width * 2, height3, width, label='bar3')

    # 依次添加每条数据的标签
    for a, b in zip(x, height1):
        plt.text(a, b, b, ha='center', va='bottom')
    for c, d in zip(x, height2):
        plt.text(c + width, d, d, ha='center', va='bottom')
    for e, f in zip(x, height3):
        plt.text(e + width * 2, f, f, ha='center', va='bottom')

    # 设置 x 轴刻度的标签
    plt.xticks(x + width, ['A', 'B', 'C', 'D', 'E'])
    plt.title('柱状图添加文字描述示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/105952856
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

## 【4x00】条形图的绘制

### 【4x01】函数介绍 matplotlib.pyplot.barh()

`matplotlib.pyplot.barh()` 函数用于绘制条形图（水平排列的柱状图）。

基本语法：`matplotlib.pyplot.barh(y, width[, height=0.8, left=None, align='center', color, \*\*kwargs])`

参数 | 描述
--- | ---
y | 标量或数组类型，每个矩形对应的 y 轴刻度
width | 标量或数组类型，每个矩形的宽度，即 x 轴刻度
height | 标量序列，每个矩形的高度，默认 0.8
left | 标量序列，每个矩形的左侧 x 坐标的起始位置，默认值为 0
align | 矩形的底边与 y 轴刻度对齐的位置，`'center'`：中；`'edge'`：底边

其他参数：

参数 | 描述
--- | ---
color | 标量或数组类型，每个矩形的颜色，与 facecolor 作用相同，指定一个即可，如果两者都指定，则取 facecolor 的值
edgecolor | 标量或数组类型，条形图边缘线的颜色
linewidth | 标量或数组类型，条形图边缘线的宽度，如果为0，则不绘制边
tick_label | 标量或数组类型，条形图 y 轴的刻度标签，默认使用数字标签
xerr / yerr | 标量，指定对应标准差（添加误差线时会用到）
ecolor | 标量或数组类型，误差线的线条颜色，默认值为 black
capsize | 标量，误差线两头横线的宽度，默认为 `rcParams["errorbar.capsize"] = 0.0`
error_kw | 字典类型，可以此字典中定义 ecolor 和 capsize，比单独指定的优先级要高
log | bool 值，y 坐标轴是否以指数刻度显示
alpha | float 类型，矩形透明度
label | 图例中显示的标签
linestyle / ls | 线条样式，此处指矩形边缘线条样式 `'-'` or `'solid'`, `'--'` or `'dashed'`, `'-.'` or `'dashdot'` or `':'` or `'dotted'`, `'none'` or `' '` or `''`
linewidth / lw | 线条宽度，此处指矩形边缘线的宽度，float 类型，默认 0.8
hatch | 矩形的填充图案，可以是组合形式，如果有相同的图案，则会增加填充的密度 取值可以是：`'/'`, `'\'`, `’ | ‘`,`‘-‘`,`‘+’`,`‘x’`,`‘o’`,`‘O’`,`‘.’`,`‘*’`

### 【4x02】简单条形图示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    y = [1, 2, 3, 4, 5]
    width = [5, 7, 4, 3, 1]

    tick_label = ['A', 'B', 'C', 'D', 'E']
    color = ['red', 'yellow', 'peru', 'orchid', 'deepskyblue']
    plt.barh(y, width, tick_label=tick_label, color=color, edgecolor='k', linewidth=1, linestyle='--')

    plt.title('简单条形图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

### 【4x03】添加与标准差的误差线

与柱状图一样，首先定义一个列表，其中的元素是与每个值对应的标准差，`ecolor` 和 `capsize` 参数分别指定误差线的颜色和两头横线的宽度。这两个参数可以通过 `error_kw` 字典形式组合起来。以字典形式的组合优先级别要比单独指定高。另外，柱状图指定标准差时要用 `yerr`，条形图（横向排列的柱状图）指定标准差时要用 `xerr`。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    y = [1, 2, 3, 4, 5]
    width = [5, 7, 4, 3, 2]
    std = [0.5, 0.1, 1.2, 0.3, 1.0]  # 标准差

    tick_label = ['A', 'B', 'C', 'D', 'E']   # 设置 x 轴的标签，也可以用 plt.xticks 方法来设置
    color = ['red', 'yellow', 'peru', 'orchid', 'deepskyblue']  # 颜色序列
    plt.barh(
        y,
        width,
        tick_label=tick_label,
        color=color,
        xerr=std,               # 指定对应标准差
        # error_kw={
        #     'ecolor': 'k',    # 指定误差线的颜色
        #     'capsize': 6      # 指定误差线两头横线的宽度
        # },
        ecolor='k',
        capsize=6,
        edgecolor='k',          # 指定边缘线颜色
        linewidth=1             # 指定边缘线宽度
    )

    plt.title('条形图添加误差线示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

### 【4x04】多序列条形图

与多序列柱状图类似，在绘制多序列的条形图时，只需要多次调用 `matplotlib.pyplot.barh()` 函数即可，指定一个较小的高度值（偏移量），绘制不同数据时设置不同的 y 位置刻度即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    y = np.arange(5)
    width1 = np.array([5, 7, 4, 3, 2])
    width2 = np.array([2, 4, 6, 7, 3])
    width3 = np.array([3, 1, 7, 5, 2])

    # 设置高度值（偏移量）
    height = 0.3
    # 绘制不同数据时，y 轴依次增加一个偏移量
    plt.barh(y, width1, height, label='bar1')
    plt.barh(y + height, width2, height, label='bar2')
    plt.barh(y + height * 2, width3, height, label='bar3')

    # 设置 y 轴刻度的标签
    plt.yticks(y + height, ['A', 'B', 'C', 'D', 'E'])
    plt.title('多序列条形图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

### 【4x05】堆积的条形图

堆积图就是将多序列数据堆积到一个矩形上显示，和堆积的柱状图类似，在条形图中要实现堆积图，只需要改变 `left` 参数即可，`left` 参数用于设置 x 轴基线，即柱状图的底边在 x 轴上的起始刻度，第一条数据 `data1` 的基线可以设置为 0，即默认值，第二条数据 `data2` 的基线可以设置在 `data1` 的上方，即 `left=data1`，第三条数据 `data3` 的基线可以设置在 `data1 + data2` 的上方，即 `left=data1+data2`，以此类推。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    y = np.arange(5)
    width1 = np.array([5, 7, 4, 3, 2])
    width2 = np.array([2, 4, 6, 7, 3])
    width3 = np.array([3, 1, 7, 5, 2])

    plt.barh(y, width1, label='bar1')
    plt.barh(y, width2, label='bar2', left=width1)
    plt.barh(y, width3, label='bar3', left=(width1+width2))

    plt.yticks(y, ['A', 'B', 'C', 'D', 'E'])
    plt.title('堆积的条形图示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

### 【4x06】填充其他样式

`hatch` 参数可以让柱状图的矩形填充其他样式，可选值有：`'/'`, `'\'`, `'|'`, `'-'`, `'+'`, `'x'`, `'o'`, `'O'`, `'.'`, `'*'`。可以是不同图案的组合形式，如果有相同的图案，则会增加填充的密度。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    y = np.arange(5)
    width1 = np.array([5, 7, 4, 3, 2])
    width2 = np.array([2, 4, 6, 7, 3])
    width3 = np.array([3, 1, 7, 5, 2])

    plt.barh(y, width1, label='bar1', color='w', hatch='///')
    plt.barh(y, width2, label='bar2', left=width1, color='w', hatch='xxx')
    plt.barh(y, width3, label='bar3', left=(width1+width2), color='w', hatch='|||')

    plt.yticks(y, ['A', 'B', 'C', 'D', 'E'])
    plt.title('条形图图案填充示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

### 【4x07】添加文字描述

利用 `matplotlib.pyplot.text()` 方法可以在条形图每个矩形上方添加文字描述。具体参数解释可参考前面的文章：《Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性》

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    y = np.arange(5)
    width1 = np.array([5, 7, 4, 3, 2])
    width2 = np.array([2, 4, 6, 7, 3])
    width3 = np.array([3, 1, 7, 5, 2])

    height = 0.3
    # 绘制不同数据时，y 轴依次增加一个偏移量
    plt.barh(y, width1, height, label='bar1')
    plt.barh(y + height, width2, height, label='bar2')
    plt.barh(y + height * 2, width3, height, label='bar3')

    # 依次添加每条数据的标签
    for a, b in zip(width1, y):
        plt.text(a, b-0.05, a)
    for c, d in zip(width2, y):
        plt.text(c, d+0.20, c)
    for e, f in zip(width3, y):
        plt.text(e, f+0.50, e)

    # 设置 y 轴刻度的标签
    plt.yticks(y + height, ['A', 'B', 'C', 'D', 'E'])
    plt.title('条形图添加文字描述示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/105952856
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

您的喜欢是作者写作最大的动力！❤️

- PayPal
- AliPay
- WeChatPay
- QQPay

Donate

最后更新于 2020年8月6日

Matplotlib

直方图

柱状图

条形图

###### 上一页

#### Python 数据分析三剑客之 Matplotlib（七）：饼状图的绘制

###### Matplotlib 饼状图

###### 下一页

#### Python 数据分析三剑客之 Matplotlib（五）：散点图的绘制

###### Matplotlib 散点图

#### 评论

## ๑۩ﺴ TRHX ﺴ۩๑

本文目录
欢迎光临

Hexo QQ 交流群 Telegram 交流群

CSDN 内容合伙人

文章分类

- BLOG
  (4)
- CDN
  (1)
- Hexo
  (9)
- Java
  (1)
- Linux
  (2)
- Markdown
  (2)
- Python 数据分析
  (27)
- Matplotlib
  (11)
- NumPy
  (6)
- Pandas
  (10)
- Python3 学习笔记
  (41)
- 基础学习
  (9)
- 学习经验
  (4)
- 爬虫学习
  (18)
- 爬虫实战
  (10)
- VPS
  (1)
- WEB前端
  (2)
- 图床
  (1)

热门标签
12306 3D图 58同城 Ajax BLOG Beautiful Soup CDN Coding Pages DataFrame Deepin Elicpse GitHub Pages Github Github Pages GroupBy HTTPS Hexo ICP备案 IO操作 Index JDBC JS 预加载 LaTeX Markdown Material X Matplotlib MongoDB MySQL NumPy PEP8 Pandas PicGo Pygame Python Redis SEO SQL Server 2012 SSR Selenium Series Ubuntu User-Agent VMware VPS XPath if语句 input()函数 instant.page jsDelivr lxml matplotibrc pyspider requests spfk urllib while循环 主题个性化 代理 位运算 公安备案 函数 函数应用 分割 切片 列表 判断函数 前程无忧 变量 合并数据集 哔哩哔哩 图例 图床 图形验证码 垃圾 备份 子图 字典 字符串函数 安居客 层级索引 年终总结 广播 异常 技巧 拼接 排序 排序函数 操作列表 散点图 数学函数 数据分裂 数据可视化 数据合并 数据替换 数据类型 数据读写 数据重塑 数组 文件 文件储存 无界面浏览器 时间序列 映射 条件函数 条形图 极区图 极坐标图 柱状图 模块 正则表达式 滑动验证码 点触验证码 爬虫 猫眼电影 瓜子二手车 画布 直方图 矩阵 等值线图 等高线图 算术函数 算术运算 类 索引 线性代数 线性图 统计函数 统计描述 统计计算 继承 编辑器 缺失值 网格 肺炎疫情 虎扑论坛 补丁 豆瓣电影 迭代 雷达图 饼状图
最近在听