I'm using the annotate
method on an Axes
object to add an arrow with text to a plot. For example:
ax.annotate('hello world,
xy=(1, 1),
xycoords='data',
textcoords='data',
fontsize=12,
backgroundcolor='w',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3")
This works well but I want to decrease the padding on the inside of the annotation box. Essentially, I want to make the box 'squeeze' tighter around the text. Is there any way to do this via the arrowprops
or bbox_props
kwargs?
I'm looking for something like borderpad
that's available on legends, similar to what's discussed on this answer.
Yes, but you'll need to switch to a slightly different way of specifying the box. The "basic" box doesn't support it, so you need to have annotate
make a FancyBboxPatch
associated with the text object. (The same syntax for a "fancy" box would work text placed with ax.text
as well, for what it's worth.)
Also, before we go much farther, there are a couple of rather thorny bugs that affect this in the current version of matplotlib (1.4.3). (e.g. https://github.com/matplotlib/matplotlib/issues/4139 and https://github.com/matplotlib/matplotlib/issues/4140)
If you're seeing things like this:
Instead of this:
You might consider downgrading to matplotlib 1.4.2 until the issue is fixed.
Let's take your example as a starting point. I've changed the background color to red and put it in the center of the figure to make it a touch easier to see. I'm also going to leave off the arrow (avoiding the bug above) and just use ax.text
instead of annotate
.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
a = ax.text(0.5, 0.5, 'hello world',
fontsize=12,
backgroundcolor='red')
plt.show()
To be able to change the padding, you'll need to use the bbox
kwarg to text
(or annotate
). This makes the text use a FancyBboxPatch
, which supports padding (along with several other things).
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
a = ax.text(0.5, 0.5, 'hello world', fontsize=12,
bbox=dict(boxstyle='square', fc='red', ec='none'))
plt.show()
The default padding is pad=0.3
. (If I recall correctly, the units are fractions of the height/width of the text's extent.) If you'd like to increase it, use boxstyle='square,pad=<something_larger>'
:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
a = ax.text(0.5, 0.5, 'hello world', fontsize=12,
bbox=dict(boxstyle='square,pad=1', fc='red', ec='none'))
plt.show()
Or you can decrease it by putting in 0
or a negative number to shrink it farther:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
a = ax.text(0.5, 0.5, 'hello world', fontsize=12,
bbox=dict(boxstyle='square,pad=-0.3', fc='red', ec='none'))
plt.show()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With