如何在Matplotlib中创建非xkcd风格的平直注释箭头
解决Matplotlib 3.7.1注释箭头默认xkcd风格问题
问题描述
使用Matplotlib 3.7.1版本时,发现annotate函数生成的默认注释箭头采用了xkcd风格——线条弯曲不平直、箭头头部未完全覆盖目标距离,但并未主动开启该风格,希望得到平直的水平箭头线条。
问题复现代码
基础示例代码
fig, ax = plt.subplots(1, 1, figsize=(6, 6)) p1 = 0.3 p2 = 0.7 ax.axvline(p1, color='k', linestyle='solid') ax.axvline(p2, color='k', linestyle='solid') ax.annotate('blah', xy=(p1, 0.75), xytext=(p2, 0.75), arrowprops=dict(arrowstyle='<->') ) ax.set_ylim(0, 1.1) ax.set_xlim(0, 1) plt.show()
运行后生成的箭头线条弯曲不平直,不符合预期。
对比验证代码
fig, ax = plt.subplots(1, 1, figsize=(6, 6)) p1 = 0.3 p2 = 0.7 ax.axvline(p1, color='k', linestyle='solid') ax.axvline(p2, color='k', linestyle='solid') ax.arrow(p1, 0.75, p2 - p1, 0, length_includes_head=True, head_width=0.1, head_length=0.01, facecolor='none', overhang=1, edgecolor='r', alpha=0.5) ax.arrow(p2, 0.75, p1 - p2, 0, length_includes_head=True, head_width=0.1, head_length=0.01, facecolor='none', overhang=1, edgecolor='r', alpha=0.5) ax.annotate('blah', xy=(p1, 0.75), xytext=(p2, 0.75), arrowprops=dict(arrowstyle='<->') ) ax.set_ylim(0, 1.1) ax.set_xlim(0, 1) plt.show()
对比可见,annotate生成的箭头线条明显弯曲,而ax.arrow生成的是平直的红色箭头,两者差异显著。
解决方案
要关闭xkcd风格的注释箭头,只需在arrowprops参数中添加connectionstyle='arc3,rad=0',强制使用平直的连接线:
fig, ax = plt.subplots(1, 1, figsize=(6, 6)) p1 = 0.3 p2 = 0.7 ax.axvline(p1, color='k', linestyle='solid') ax.axvline(p2, color='k', linestyle='solid') ax.annotate('blah', xy=(p1, 0.75), xytext=(p2, 0.75), arrowprops=dict(arrowstyle='<->', connectionstyle='arc3,rad=0') ) ax.set_ylim(0, 1.1) ax.set_xlim(0, 1) plt.show()
connectionstyle='arc3,rad=0'指定使用半径为0的圆弧连接线,也就是完全平直的线条,这样就能得到符合预期的水平直箭头。
如果希望全局修改默认行为,避免每次调用annotate都手动添加参数,可以设置Matplotlib的全局配置:
import matplotlib as mpl mpl.rcParams['patch.connectionstyle'] = 'arc3,rad=0'
内容的提问来源于stack exchange,提问作者Finncent Price
相关产品推荐
相关产品推荐

