在PCA深入探究一节中,提及了箭头的绘制。有的朋友私信希望详细说一下箭头的绘制方法,特此单列一节举例说明matplotlib中箭头的绘制语法。准备好,开始发车!!
1
annotate基本标注
annotate的语法:
Axes.annotate(text, xy, xytext=None, xycoords='data', textcoords=None, arrowprops=None, **kwargs)
参数解释:
text:箭头的文本
xy:箭头的起始坐标,例如xy=(0, 0)表示从原点开始
xytext:字体放置的坐标,也是箭头的终点坐标,例如xytext=(1,1)表示箭头指向(1, 1)坐标,字体也放置在该坐标处。
xycoords和textcoords:选择其他的坐标系,因为不常用,就不做解释,感兴趣可以在官网查看。
arrowprops:箭头属性,字典类型。具体参数如下表:
annotate键 | 描述 |
---|---|
width | 箭头宽度 |
headwidth | 箭头底部宽度 |
headlength | 箭头长度 |
shrink | 两端收缩占总长度的分数,0-1之间 |
facecolor | 箭头内部颜色(不改变箭头边界颜色) |
color | 箭头颜色,同时改变边界和内部颜色 |
**kwargs:箭头的其他设置,如文本字体大小,字体样式等。
基本标注:
以matplotlib官网的一个示例,进行基础的箭头绘制,下面代码绘制了一个箭头,设定内部为红色,边框默认黑色。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(0.0, 4, 0.01)
y = np.cos(2*np.pi*x)
line, = ax.plot(x, y, lw=2)
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='red'))
ax.set_ylim(-2, 2)
plt.show()
如果要改变文本字体和大小,则需要**kwargs参数,通过添加fontproperties改变字体样式, size 控制大小。下面代码设置箭头字体为新罗马,大小为10号。
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='red'), fontproperties = 'Times New Roman', size = 15)
事实上,annotate支持多种箭头样式绘制,在arrowprops添加对应的键值就可以使用对应的箭头样式,支持的如下图几种:
图片来自CSDN
下面代码使用了“fancy”箭头样式:
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(arrowstyle = 'fancy', color = 'k'))
以上标注都是针对数据坐标系,对于极坐标系的绘制方法可能不同,我们需要改变箭头所在的坐标系,下面是来自matplotlib官网的一个示例:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(projection='polar')
r = np.arange(0, 1, 0.001)
theta = 2 * 2*np.pi * r
line, = ax.plot(theta, r, color='#ee8d18', lw=3)
y_note, angle_note = r[800], theta[800] #确定角度和对应角度值
ax.plot([angle_note], [y_note], 'o') #绘制单个点
ax.annotate('a polar annotation',
xy=(angle_note, y_note), # t角度和角度值
xytext=(0.03, 0.2), # fraction, fraction
textcoords='figure fraction', #关键,确定了标注箭头的坐标系
arrowprops=dict(facecolor='black', shrink=0.05),
)
plt.show()
搭配上for循环,我们就可以一次性绘制多个矢量箭头,下面的示例绘制了8个方向箭头。
x_target = [1, 0, -1]
y_target = [1, 0, -1]
labels = ['var' + str(i) for i in range(9)]
fig = plt.subplot()
i = 0
for x in x_target:
for y in y_target: #剔除坐标为(0,0)的矢量箭头
if (x == 0) & (y == 0):
continue
plt.annotate(labels[i], xy=(0, 0), xytext=(x, y), arrowprops=dict(arrowstyle = '<-', color = 'k', linewidth = 2),
fontproperties = 'Times New Roman', size = 15)
i += 1
plt.plot(0, 0, 'o', c = 'k')
plt.ylim(-1.5, 1.5)
plt.xlim(-1.5, 1.5)
plt.show()
由于xytext是文本的位置,所以位于x轴和y轴方向的箭头实际方向与理想会有偏移,我们在应用中只需要微调它们的指向即可(文本的标注位置)。
THE END
本小节主要介绍了matplolib中箭头的绘制方法,使用annotate实现基本的箭头标注。通过facecolor控制内部颜色,fontproperties控制字体样式,size控制大小,arrowprops控制箭头属性,还补充了若干常用箭头的样式。
篇幅有限,关于matplotlib箭头高级标注在下节说明,在此之前一定要掌握好基本标注方法。