# 添加数据标记

# 在 matplotlib 中,折线图的线条由数据标记及其之间的连线组成,且默认隐藏数据标记。数据标记一般指代表单个数据的圆点或其他符号等,用于强调数据点的位置,常见于折线图和散点图中。下面将介绍在折线图或散点图中添加数据标记的方法。

# 添加折线图或散点图的数据标记

# matplotlib 中内置了许多数据标记,使用这些数据标记可以便捷地为折线图或散点图标注数据点。数据标记可以分为填充型标记和非填充型标记,这两种标记的取值、样式及说明分别如图 4-4 和图 4-5 所示。

# 使用 pyplot 的 plot() 或 scatter() 函数绘制折线图或散点图时,可以将标记的取值传递给marker 参数,从而为折线图或散点图添加数据标记。
例如,绘制一条带有星形标记的折线,代码如下:

plt.plot([1, 2, 3], [3, 4, 5], marker='*')

# 除此之外,pyplot 还可以为以下参数传值以控制标记的属性:

# · markeredgecolor 或 mec :表示标记的边框颜色。
· markeredgewidth 或 mew :表示标记的边框宽度。
· markerfacecolor 或 mfc :表示标记的填充颜色。
· markerfacecoloralt 或 mfcalt :表示标记备用的填充颜色。
· markersize 或 ms :表示标记的大小。

# 例如,为刚刚添加的星形标记设置大小和颜色,代码如下:

plt.plot([1, 2, 3], [3, 4, 5], marker='*', markersize=20, markerfacecolor='y')

# 以上示例绘制的线条效果如图 4-6 所示。

# 多学一招:matplotlib 格式字符串

# matplotlib 在绘制折线图时,可以使用字符串分别为线条指定颜色、线型和数据标记这 3 种形式,但每次都需要分别给参数 color、linestyle、marker 传值,使得编写的代码过于烦琐。为此,matplotlib 提供了由颜色、标记、线型构成的格式字符串。格式字符串是快速设置线条基本样式的缩写形式的字符串,语法格式如下所示:
'[颜色][标记][线型]'
# 以上格式的每个选项都是可选的,选项之间组合的顺序也是可变的,若未提供则会使用样式循环中的值。其中,颜色只能是字母缩写形式表示的颜色。
若格式字符串中只有颜色一个选项,可以使用十六进制、单词拼写等其他形式表示的颜色。
pyplot 的 plot() 函数的 fmt 参数可接收格式字符串,以便能同时为线条指定多种样式,但该参数不支持以 fmt 为关键字的形式传参,而支持以位置参数的形式传递。
例如,绘制带有圆形标记的品红色虚线,代码如下 :
plt.plot([1, 2, 3], [3, 4, 5], 'mo--')

# 实例3:标记不同产品各季度的销售额

# 已知某公司旗下共有 3 款明星产品 :产品 A、产品 B 和产品 C。为了解每款产品全年的销售额,公司对每款产品的年销售额进行了核算,核算之后的结果如表 4-5 所示。

# 根据表 4-5 的数据,将“季度”一列的数据作为 x 轴的刻度标签,将“产品 A”“产品 B”“产品 C” 三列的数据作 y 轴的数据,分别使用 plot() 函数绘制反映产品 A 、产品 B 和产品 C 各季度的销售额的折线图,并使用不同的线型、颜色、标记进行区分,具体代码如下。

In [7]:
# 03_sales_of_different_products
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
sale_a = [2144, 4617, 7674, 6666]
sale_b = [853, 1214, 24i4, 4409]
sale_c = [153, 155, 292, 680]
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制具有不同线条样式的折线图
ax.plot(sale_a, 'D-', sale_b, '^:', sale_c, 's--')
ax.grid(alpha=0.3)
ax.set_ylabel('销售额(万元)')
ax.set_xticks(np.arange(len(sale_c)))
ax.set_xticklabels(['第 1 季度', '第 2 季度', '第 3 季度', '第 4 季度'])
ax.legend(['产品 A', '产品 B', '产品 C'])
plt.show()

# 运行程序,效果如图 4-7 所示。
图 4-7中,每条折线均使用不同样式的数据标记标注了数据的位置,其中蓝色折线使用菱形标注了产品 A 各季度的销售额;橙色折线使用正三角形标注了产品 B 各季度的销售额;绿色折线使用正方形标注了产品 C 各季度的销售额。由图 4-7 可知,产品 A 在各季度的销售额都高于另两个产品,产品 C 在各季度的销售额都低于另两个产品。