# 添加注释文本

# 注释文本是图表的重要组成部分,它能够对图形进行简短描述,有助于用户理解图表。注释文本按注释对象的不同主要分为指向型注释文本和无指向型注释文本,其中指向型注释文本一般是针对图表某一部分的特定说明,无指向型注释文本一般是针对图表整体的特定说明。下面将介绍添加指向型注释文本和无指向型注释文本的方法。

# 添加指向型注释文本

# 指向型注释文本是指通过指示箭头的注释方式对绘图区域的图形进行解释的文本,它一般使用线条连接说明点和箭头指向的注释文字。pyplot 模块中提供了 annotate() 函数为图表添加指向型注释文本,该函数的语法格式如下所示:

annotate(s, xy, *args, **kwargs)

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

# · s :表示注释文本的内容。
· xy :表示被注释的点的坐标位置,接收元组 (x,y)。
· xytext :表示注释文本所在的坐标位置,接收元组 (x,y)。
· xycoords :表示 xy 的坐标系统,默认值为 “data”, 代表与折线图使用相同的坐标系统。
· arrowprops :表示指示箭头的属性字典。
· bbox :表示注释文本的边框属性字典。

# arrowprops 参数接收一个包含若干键的字典,通过向字典中添加键值对来控制箭头的显示。常见的控制箭头的键包括 width、headwidth、headlength、shrink、arrowstyle 等, 其中键arrowstyle 代表箭头的类型,该键对应的值及对应的类型如图 3-14 所示。

image

# 在 3.5.2 节绘制的正弦和余弦曲线图中添加指向型注释文本,增加的代码如下。

# 添加指向型注释文本
plt.annotate("最小值",
             xy=(-np.pi / 2, -1.0),
             xytext=(-(np.pi / 2), -0.5),
             arrowprops=dict(arrowstyle="->"))

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

image

# 添加无指向型注释文本

# 无指向型注释文本是指仅使用文字的注释方式对绘图区域的图形进行说明的文本。pyplot 模块中提供了 text() 函数为图表添加无指向型注释文本,该函数的语法格式如下所示:

text (x, y, s, fontdict=None, withdash=<deprecated parameter>, **kwargs)

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

# · x,y :表示注释文本的位置。
· s :表示注释文本的内容。
· fontdict :表示控制字体的字典。
· bbox :表示注释文本的边框属性字典。
· horizontalalignment 或 ha :表示水平对齐的方式,可以取值为 center、right 或 left。
· verticalalignment 或 va :表示垂直对齐的方式,可以取值为 center、top、bottom、baseline 或 center_baseline。

# 在 3.6.1 节绘制的正弦和余弦曲线图中添加无指向型注释文本,增加的代码如下。

# 添加无指向型注释文本
plt.text(3.10, 0.10, "y=sin(x)", bbox=dict(alpha=0.2))

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

image

# 多学一招:matplotlib 编写数学表达式

# matplotlib 中自带 mathtext 引擎,通过该引擎可以自动识别使用 annotateo() 或 text() 函数传入的数学字符串,并解析成对应的数学表达式。数学字符串有固定的格式,它要求字符串以美元符号 “$” 为首尾字符,且首尾字符中间为数学表达式,基本格式如下所示:
'$数学表达式$'
# 为保证字符串中的所有字符能以字面的形式显示,数学字符串需要配合 “r” 使用。下面是使用 matplotlib 编写的一个简单的数学字符串:
r'$\alpha > \beta$'
# 以上字符串中 “\alpha” 和 “\beta” 对应常见的小写希腊字母 α 和 β ,其对应的数学表达式如下:

$$ \alpha > \beta $$

# 此外,“\alpha” 和 “\beta” 的后面还可以增加上标和下标,其中上标使用符号“^”表示,下标使用符号“_”表示。例如,将 α 的下标设为 i 将 β 的下标设为 i 的示例如下:
r'$\alpha_i > \beta_i$'
# 以上示例对应的数学表达式如下:

$$ \alpha_i > \beta_i $$

# matplotlib 中使用 “\frac{}{}” 可以编写分数形式的数字字符串,“\frac” 后面的两个大括号分别代表分数的分子和分母,示例代码如下:
r'$\frac{3}{4}$'
# 以上示例对应的数学表达式如下:

$$ \frac{3}{4} $$

# 此外,还可以编写分数嵌套的数学字符串,代码如下:
r'$\frac{5 - \frac{1}{x}}{4}$'
# 以上示例对应的数学表达式如下:

$$ \frac{5 - \frac{1}{x}}{4} $$

# 更多内容可以参照 matplotlib 官网自学,此处不再赘述。

# 实例5:2013—2019 财年某电商平台的 GMV (添加注释文本)

# 虽然柱形图中可以通过柱形的高度反映每组数据的多少,但是仍然无法让用户精准地知道具体数值。因此,柱形图经常会与注释文本配合使用,在柱形的顶部标注具体数值。2.2.2 节实例中的柱形图描述了某电商平台的 CMV , 但图中的矩形条缺少具体的数值,因此这里将在柱形图中添加无指向型注释文本,代码如下。

In [6]:
# 05_commerce_p1atform_gmv
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_mninus'] = False
x = np.arange(1, 8)
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])
bar_rects = plt.bar(x, y, tick_label=["FY2013", "FY2014", "FY2015",
                    "FY2016", "FY2017", "FY2018", "FY2019"], width=0.5)
# 添加无指向型注释文本
def autolabel(rects):
    """在每个矩形条的上方附加一个文本标签,以显示其高度"""
    for rect in rects:
        height = rect.get_height()      # 获取每个矩形条的高度
        plt.text(rect.get_x() + rect.get_width() / 2, height + 300,
                s='{}'.format(height),
                ha='center', va='bottom')
autolabel(bar_rects)
plt.ylabel('GMV(亿元)')
plt.show()

# 运行程序,效果如图 3-17 所示。
与图 2-6 相比,图 3-17 的柱形图增加了 y 轴的标签和注释文本,帮助用户准确地知道各柱形对应的数值。

image