Matplotlib bar()创建柱形图详解(附带实例)
柱形图用于比较数据之间的差异。如需创建柱形图,可以使用 pyplot 模块中的 bar() 函数或 Axes 对象的 bar() 方法,它们的用法相同。
下面的代码是使用 Axes 对象的 bar() 方法创建如下图所示的柱形图,变量 x 定义每个柱形在 x 轴上的位置,变量 height 定义每个柱形的高度,即每个柱形在 y 轴上的位置。

图 1 柱形图
为了使 y 轴刻度更精确,可以调整坐标轴刻度,修改后的代码如下:
调整 y 轴刻度后的柱形图如下图所示:

图 2 调整y轴刻度后的柱形图
前面创建的柱形图的柱形宽度使用的是默认值。如需改变柱形的宽度,可以在 bar() 函数或 bar() 方法中指定 width 参数,其默认值为 0.8。下面的代码将柱形图的柱形宽度设置为 0.5:

图 3 改变柱形的宽度
堆积柱形图中的两组数据具有相同的 x 轴坐标,其中一组数据的 y 轴坐标由 bottom 参数指定,该组数据将位于每个柱形的底部,另一组数据位于每个柱形的顶部。
下面的代码使用两组数据创建堆积柱形图,第一组数据位于每个柱形的底部,第二组数据位于每个柱形的顶部,为了使每组数据的含义更清晰,将图例显示在图表的右上角:

图 4 堆积柱形图
创建并列柱形图的关键是第二组数据的每个柱形的 x 轴坐标,需要通过对第一组数据的x轴坐标与该组数据的每个柱形的宽度进行求和来得到。
下面的代码使用两组数据创建并列柱形图。每组数据的柱形的宽度都是 0.4,第二组数据的 x 轴坐标由第一组数据的 x 轴坐标加上 0.4 后计算得到,这样可以确保第二组柱形会紧挨在第一组柱形之后。

图 5 并列柱形图
为了让每一组中的两个柱形对齐于刻度的两侧,需要将第一组柱形的右边缘与刻度对齐,将第二组柱形的左边缘与刻度对齐。为此,需要指定 align 参数,将其值设置为 edge,表示将柱形的左边缘与刻度对齐。
为了让柱形的右边缘与刻度对齐,需要将 align 参数设置为 edge,同时将 width 参数设置为负值:

图 6 将每一组柱形对齐于刻度的两侧
下面的代码将 color 参数设置为一个包含6种颜色的列表,这些颜色值使用的是表示颜色的单个字符 r、g、b、c、m 和 y,创建的柱形图中的 6 个柱形被设置为 6 种不同的颜色:

图 7 为柱形设置不同的颜色
Matplotlib bar()创建基本柱形图
创建柱形图时,必须指定 bar() 函数或 bar() 方法的前两个参数,第一个参数 x 表示每个柱形的 x 轴坐标,第二个参数 height 表示每个柱形的高度,即 y 轴坐标。其他参数都是关键字参数。下面的代码是使用 Axes 对象的 bar() 方法创建如下图所示的柱形图,变量 x 定义每个柱形在 x 轴上的位置,变量 height 定义每个柱形的高度,即每个柱形在 y 轴上的位置。

图 1 柱形图
import matplotlib.pyplot as plt x = range(1, 7) height = [20, 50, 90, 60, 30, 70] fig, ax = plt.subplots() ax.bar(x, height) plt.show()下面的代码是使用 pyplot 模块中的 bar() 函数实现相同的功能。由于 pyplot 模块中用于创建图表的函数与 Axes 对象的同名方法具有完全相同的功能,编写的代码几乎一样,所以后续创建图表时,将不再重复给出使用 pyplot 模块中的函数创建图表的代码。
import matplotlib.pyplot as plt x = range(1, 7) height = [20, 50, 90, 60, 30, 70] plt.bar(x, height) plt.show()
为了使 y 轴刻度更精确,可以调整坐标轴刻度,修改后的代码如下:
import matplotlib.pyplot as plt x = range(1, 7) height = [20, 50, 90, 60, 30, 70] fig, ax = plt.subplots() ax.bar(x, height) ax.yaxis.set_ticks(range(0, 101, 10)) plt.show()
调整 y 轴刻度后的柱形图如下图所示:

图 2 调整y轴刻度后的柱形图
前面创建的柱形图的柱形宽度使用的是默认值。如需改变柱形的宽度,可以在 bar() 函数或 bar() 方法中指定 width 参数,其默认值为 0.8。下面的代码将柱形图的柱形宽度设置为 0.5:
import matplotlib.pyplot as plt x = range(1, 7) height = [20, 50, 90, 60, 30, 70] fig, ax = plt.subplots() ax.bar(x, height, width=0.5) ax.yaxis.set_ticks(range(0, 101, 10)) plt.show()效果如下图所示:

图 3 改变柱形的宽度
Matplotlib bar()创建堆积柱形图
堆积柱形图是指两组数据在每个柱形上堆叠在一起,为 bar() 函数或 bar() 方法指定 bottom 参数,将创建堆积柱形图。堆积柱形图中的两组数据具有相同的 x 轴坐标,其中一组数据的 y 轴坐标由 bottom 参数指定,该组数据将位于每个柱形的底部,另一组数据位于每个柱形的顶部。
下面的代码使用两组数据创建堆积柱形图,第一组数据位于每个柱形的底部,第二组数据位于每个柱形的顶部,为了使每组数据的含义更清晰,将图例显示在图表的右上角:
import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams['font.sans-serif'] = 'SimSun' x = range(1, 7) y1 = [20, 50, 90, 60, 30, 70] y2 = [10, 30, 70, 20, 80, 10] fig, ax = plt.subplots() ax.bar(x, y1, label='产品一') ax.bar(x, y2, bottom=y1, label='产品二') ax.legend(loc='upper right') plt.show()效果如下图所示:

图 4 堆积柱形图
Matplotlib bar()创建并列柱形图
并列柱形图是指两组数据中位于相同位置上的两项数据的两个柱形紧挨在一起。创建并列柱形图的关键是第二组数据的每个柱形的 x 轴坐标,需要通过对第一组数据的x轴坐标与该组数据的每个柱形的宽度进行求和来得到。
下面的代码使用两组数据创建并列柱形图。每组数据的柱形的宽度都是 0.4,第二组数据的 x 轴坐标由第一组数据的 x 轴坐标加上 0.4 后计算得到,这样可以确保第二组柱形会紧挨在第一组柱形之后。
import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams['font.sans-serif'] = 'SimSun' x1 = range(1, 7) x2 = [x + 0.4 for x in x1] y1 = [20, 50, 90, 60, 30, 70] y2 = [10, 30, 70, 20, 80, 10] fig, ax = plt.subplots() ax.bar(x1, y1, width=0.4, label='产品一') ax.bar(x2, y2, width=0.4, label='产品二') ax.legend(loc='upper left') plt.show()效果如下图所示:

图 5 并列柱形图
为了让每一组中的两个柱形对齐于刻度的两侧,需要将第一组柱形的右边缘与刻度对齐,将第二组柱形的左边缘与刻度对齐。为此,需要指定 align 参数,将其值设置为 edge,表示将柱形的左边缘与刻度对齐。
为了让柱形的右边缘与刻度对齐,需要将 align 参数设置为 edge,同时将 width 参数设置为负值:
import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams['font.sans-serif'] = 'SimSun' x1 = range(1, 7) x2 = x1 y1 = [20, 50, 90, 60, 30, 70] y2 = [10, 30, 70, 20, 80, 10] fig, ax = plt.subplots() ax.bar(x1, y1, width=-0.4, align='edge', label='产品一') ax.bar(x2, y2, width=0.4, align='edge', label='产品二') ax.legend(loc='upper left') plt.show()创建后的柱形图如下图所示:

图 6 将每一组柱形对齐于刻度的两侧
Matplotlib bar()为柱形设置不同的颜色
在 bar() 函数或 bar() 方法中指定 color 参数,可以为柱形设置相同或不同的颜色。如果将该参数设置为一个表示颜色的值,则所有柱形都具有相同的颜色。如果将该参数设置为包含多个颜色值的列表,则每个柱形都将设置为不同的颜色。下面的代码将 color 参数设置为一个包含6种颜色的列表,这些颜色值使用的是表示颜色的单个字符 r、g、b、c、m 和 y,创建的柱形图中的 6 个柱形被设置为 6 种不同的颜色:
import matplotlib.pyplot as plt x = range(1, 7) height = [20, 50, 90, 60, 30, 70] color = list('rgbcmy') fig, ax = plt.subplots() ax.bar(x, height, color=color) plt.show()效果如下图所示:

图 7 为柱形设置不同的颜色