Skip to content

Unable to change cap style on annotation. #4332

@breedlun

Description

@breedlun

As shown below, I have tried to change the arrow cap style on an annotation using rcParams, changing the cap style on the arrow path directly, and specifying the cap style in the arrowprops dictionary. None of them worked.

import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams['lines.solid_capstyle'] = 'butt'

fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

anno = ax.annotate('5 mm', xytext = [0.5, 0.25], textcoords = 'axes fraction', \
            xy = [0.0, 0.25], xycoords = 'axes fraction', clip_on = False, \
            arrowprops=dict(arrowstyle='-', connectionstyle='arc3, rad=0.0', \
            fc='none', shrinkA = 10, shrinkB = 0.0, \
            linewidth = 8))
anno.arrow_patch.set_capstyle('butt')

anno = ax.annotate('5 mm', xytext = [0.5, 0.5], textcoords = 'axes fraction', \
            xy = [0.0, 0.5], xycoords = 'axes fraction', clip_on = False, \
            arrowprops=dict(arrowstyle='-', connectionstyle='arc3, rad=0.0', \
            fc='none', shrinkA = 10, shrinkB = 0.0, \
            linewidth = 8, capstyle = 'butt'))

fig.canvas.draw()
fig.savefig('scale_bar_issue.png')

anno = ax.annotate('5 mm', xytext = [0.5, 0.75], textcoords = 'axes fraction', \
            xy = [0.0, 0.75], xycoords = 'axes fraction', clip_on = False, \
            arrowprops=dict(arrowstyle='-', connectionstyle='arc3, rad=0.0', \
            fc='none', shrinkA = 10, shrinkB = 0.0, \
            linewidth = 8, solid_capstyle = 'butt'))

Right after the figure.canvas.draw() the window looks like this

scale_bar_issue

Clearly, I still have rounded caps on my lines (arrows).

Furthermore, in the last attempt, I specified solid_capstyle = 'butt' in the arrowprops dictionary, and it failed with the following traceback

File "/Users/breedlu/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 651, in annotate
a = mtext.Annotation(*args, **kwargs)
File "/Users/breedlu/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/text.py", line 1812, in __init__
**arrowprops)
File "/Users/breedlu/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/patches.py", line 3888, in __init__
Patch.__init__(self, **kwargs)
File "/Users/breedlu/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/patches.py", line 118, in __init__
self.update(kwargs)
File "/Users/breedlu/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/artist.py", line 757, in update
raise AttributeError('Unknown property %s' % k)
AttributeError: Unknown property solid_capstyle

It appears that the arrowprops dictionary can include patch properties, such as capstyle, but not line properties, such as solid_capstyle. This seems to be counter to the documentation here, where it says that "arrowprops, if not None, is a dictionary of line properties (see matplotlib.lines.Line2D) for the arrow that connects annotation to the point."

Metadata

Metadata

Assignees

Labels

API: consistencyDifficulty: Mediumhttps://matplotlib.org/devdocs/devel/contribute.html#good-first-issues

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions