前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matplotlib的箭头绘制(1)——基本标注

Matplotlib的箭头绘制(1)——基本标注

作者头像
python数据可视化之路
发布2023-02-23 21:28:52
1.8K0
发布2023-02-23 21:28:52
举报

PCA深入探究一节中,提及了箭头的绘制。有的朋友私信希望详细说一下箭头的绘制方法,特此单列一节举例说明matplotlib中箭头的绘制语法。准备好,开始发车!!

1

annotate基本标注

annotate的语法:

代码语言:javascript
复制
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官网的一个示例,进行基础的箭头绘制,下面代码绘制了一个箭头,设定内部为红色,边框默认黑色。

代码语言:javascript
复制
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号。

代码语言:javascript
复制
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”箭头样式:

代码语言:javascript
复制
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(arrowstyle = 'fancy', color = 'k'))

以上标注都是针对数据坐标系,对于极坐标系的绘制方法可能不同,我们需要改变箭头所在的坐标系,下面是来自matplotlib官网的一个示例:

代码语言:javascript
复制
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个方向箭头。

代码语言:javascript
复制
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箭头高级标注在下节说明,在此之前一定要掌握好基本标注方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python数据可视化之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档