如何更新Matplotlib中已有标注的箭头样式与收缩参数?
解决Matplotlib标注箭头样式无法修改的问题
问题现象
尝试修改Matplotlib中已创建Annotation对象的箭头样式时,通过ann.arrow_patch.set_arrowstyle()方法无法生效,但修改连接样式(set_connectionstyle())和其他外观属性(如set(ec='red'))正常工作,独立创建的FancyArrowPatch对象则可正常修改箭头样式。即使调用update_positions()方法也无法解决该问题。
复现代码:
from matplotlib import pyplot as plt from matplotlib.patches import FancyArrowPatch fig, ax = plt.subplots() # 独立FancyArrowPatch可正常修改样式 arrow = FancyArrowPatch((0.1, 0.1), (.9, .9), mutation_scale=100) ca = ax.add_patch(arrow) arrow.set(ec='red') # 生效 arrow.set_arrowstyle('->') # 生效 arrow.set_connectionstyle('Arc3,rad=.2') # 生效 # Annotation的箭头样式修改无效 ann = ax.annotate('Annotation', xy=(.1, .9), xytext=(.9, .1), arrowprops=dict(fc='black')) ann.arrow_patch.set_arrowstyle('->') # 不生效 ann.arrow_patch.set_connectionstyle('Arc3,rad=.2') # 生效 ann.arrow_patch.set(ec='red') # 生效 plt.show()
原因分析
Annotation对象内部维护着arrowprops字典,每次绘图重绘时,会根据这个字典重新生成箭头的样式配置,直接修改arrow_patch的属性会被后续重绘操作覆盖,导致修改无效。而set_connectionstyle()能生效是因为连接样式的更新不会被Annotation的重绘逻辑覆盖。
解决方法
直接修改Annotation的arrowprops字典,然后调用set_arrowprops()方法刷新配置,或者直接传入新的arrowprops参数:
方法1:修改现有arrowprops并刷新
from matplotlib import pyplot as plt from matplotlib.patches import FancyArrowPatch fig, ax = plt.subplots() ann = ax.annotate('Annotation', xy=(.1, .9), xytext=(.9, .1), arrowprops=dict(fc='black')) # 修改arrowprops字典 ann.arrowprops['arrowstyle'] = '->' ann.arrowprops['connectionstyle'] = 'Arc3,rad=.2' ann.arrowprops['edgecolor'] = 'red' # 调用set_arrowprops刷新配置 ann.set_arrowprops(ann.arrowprops) plt.show()
方法2:直接传入新的arrowprops参数
from matplotlib import pyplot as plt from matplotlib.patches import FancyArrowPatch fig, ax = plt.subplots() ann = ax.annotate('Annotation', xy=(.1, .9), xytext=(.9, .1), arrowprops=dict(fc='black')) # 直接传入包含新样式的arrowprops ann.set_arrowprops(dict( fc='black', arrowstyle='->', connectionstyle='Arc3,rad=.2', edgecolor='red' )) plt.show()
这样修改后,箭头样式会正确生效,因为Annotation会使用更新后的arrowprops重新生成箭头配置,不会被重绘覆盖。
内容的提问来源于stack exchange,提问作者Tamas
相关产品推荐
相关产品推荐

