import matplotlib.pyplot as plt
import numpy as np# 生成100个随机数据
data = np.random.rand(100)# 绘制数据
plt.plot(data, label='Data Points')# 获取最后一个数据点的位置和值
last_x = len(data) - 1
last_y = data[-1]# 用红圈标出最后一个点
plt.plot(last_x, last_y, 'ro')# 在图上标出最后一个点的值
plt.annotate(f'{last_y:.2f}',xy=(last_x, last_y), xytext=(last_x + 2, last_y), fontsize=12, # 字体大小color='red'# textcoords='offset points',# ha='left', # va='bottom')# 设置标题和坐标轴标签
plt.title('Plot with Last Data Point Highlighted and Labeled')
plt.xlabel('Index')
plt.ylabel('Value')# 显示图形
plt.legend()
plt.savefig("test")
这段代码将最后一个数据点的值用放大的红色字体标注出来,并在图上用红圈圈出该点。
plt.annotate
是 Matplotlib 用于在图形上添加注释(文本)的函数。以下是 plt.annotate
函数的常用参数及其对应的含义:
plt.annotate(text, xy, xytext=None, xycoords='data',textcoords=None, arrowprops=None, **kwargs)
参数解释
-
text
:- 要显示的注释文本内容。
-
xy
:- 一个包含两个元素的元组或列表,用于指定注释指向的位置,格式为
(x, y)
。 - 这个位置表示的是注释的目标点。
- 一个包含两个元素的元组或列表,用于指定注释指向的位置,格式为
-
xytext
(可选):- 一个包含两个元素的元组或列表,用于指定注释文本的位置,格式为
(x, y)
。 - 如果不指定,默认值为
xy
。
- 一个包含两个元素的元组或列表,用于指定注释文本的位置,格式为
-
xycoords
(可选):- 指定
xy
所使用的坐标系,默认值是'data'
,表示数据坐标。 - 其他常见选项包括
'figure points'
(图形窗口的点)、'figure pixels'
(图形窗口的像素)、'axes points'
(轴内的点)、'axes fraction'
(轴内的分数)。
- 指定
-
textcoords
(可选):- 指定
xytext
所使用的坐标系,默认值是xycoords
的值。 - 可选值与
xycoords
类似。
- 指定
-
arrowprops
(可选):- 一个字典,用于定义箭头的样式。常见的键包括:
'arrowstyle'
:箭头样式,例如'->'
、'-['
等。'color'
:箭头颜色。'shrink'
:缩小箭头的比例。'linewidth'
:箭头的线宽。
- 一个字典,用于定义箭头的样式。常见的键包括:
-
其他
**kwargs
参数:- 这些是与注释文本相关的其他关键字参数,如
fontsize
(字体大小)、color
(字体颜色)、horizontalalignment
(水平对齐)、verticalalignment
(垂直对齐)等。
- 这些是与注释文本相关的其他关键字参数,如
例子
plt.annotate('This is a point',xy=(10, 10), # 注释指向的点xytext=(15, 15), # 注释文本的位置textcoords='offset points', # 以偏移量作为坐标系arrowprops=dict(facecolor='black', arrowstyle='->'), # 添加箭头fontsize=12, # 字体大小color='red') # 字体颜色
在这个例子中,注释文本 This is a point
会显示在图形中的某个位置(由 xytext
指定),并且有一个箭头指向图形中的点 (10, 10)
。字体大小设置为 12,颜色为红色。
使用ax版本
在 subplots
中,你可以通过在绘制图形后,使用 ax.annotate
方法来显示最后一个数据点的值。这里是一个简单的例子,展示如何在 subplots
中标注最后一个点的值。
import matplotlib.pyplot as plt
import numpy as np# 生成两个不同的数据集
data1 = np.random.rand(100)
data2 = np.random.rand(100)# 创建子图
fig, axs = plt.subplots(2)# 绘制第一个数据集
axs[0].plot(data1, label='Data 1')
last_x1 = len(data1) - 1
last_y1 = data1[-1]
axs[0].plot(last_x1, last_y1, 'ro') # 用红色圆圈标记最后一个点
axs[0].annotate(f'{last_y1:.2f}', xy=(last_x1, last_y1), xytext=(last_x1 + 2, last_y1),textcoords='offset points', ha='left', va='bottom', fontsize=12, color='red')# 绘制第二个数据集
axs[1].plot(data2, label='Data 2')
last_x2 = len(data2) - 1
last_y2 = data2[-1]
axs[1].plot(last_x2, last_y2, 'ro') # 用红色圆圈标记最后一个点
axs[1].annotate(f'{last_y2:.2f}', xy=(last_x2, last_y2), xytext=(last_x2 + 2, last_y2),textcoords='offset points', ha='left', va='bottom', fontsize=12, color='red')# 设置标题和坐标轴标签
axs[0].set_title('Plot 1')
axs[1].set_title('Plot 2')# 显示图形
plt.tight_layout()
plt.show()
解释:
- 创建子图:使用
plt.subplots(2)
创建了两个子图(可以根据需要调整子图数量)。 - 绘制数据:在每个子图中,分别绘制
data1
和data2
。 - 标注最后一个点:
- 使用
ax.plot
方法绘制图形,并用红色圆圈标记最后一个点。 - 使用
ax.annotate
方法在每个子图中标注最后一个数据点的值。xy
参数指定点的位置,xytext
指定文本的位置和偏移,textcoords
指定坐标系。
- 使用
- 布局调整:
plt.tight_layout()
自动调整子图的布局以避免重叠。
运行这段代码后,你会看到每个子图中最后一个点都被标记并显示其数值。