Phlya / adjustText

A small library for automatically adjustment of text position in matplotlib plots to minimize overlaps.

Home Page:https://adjusttext.readthedocs.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Issue with "matplotlib.axes.Axes.annotate" using the arguments "xytext" and "textcoords"

lendres opened this issue · comments

Description

It seems that the text coordinate system of "offset points" of the function matplotlib.axes.Axes.annotate confuses adjust_text.

From some initial testing, it seems like adjust_text reads the position of the text as the offset position when xytext and textcoords are provided.

Function

import numpy                           as np
import matplotlib.pyplot               as plt
from   adjustText                      import adjust_text

def Plot(adjustText=False, **kwargs):
    np.random.seed(0)
    x, y    = np.random.random((2,30))
    fig, ax = plt.subplots()
    plt.plot(x, y, 'bo')
    texts = []
    for i in range(len(x)):
        texts.append(ax.annotate('Text%s' %i, [x[i], y[i]], horizontalalignment="center", verticalalignment="bottom", **kwargs))
    if adjustText:
        adjust_text(texts)

Without XYText

The result is as expected.

Plot(adjustText=False)
Plot(adjustText=True)

image
image

With XYText

The result is not as expected. It seems adjust_text and the arguments of xytext and textcoords do not work together.

Plot(adjustText=False, xytext=(0, 5), textcoords="offset points")
Plot(adjustText=True, xytext=(0, 5), textcoords="offset points")

image
image

adjust_text is not compatible with ax.annotate, it requires specifically as.text.

I could not find a way to extract text bounding box from an annotation object. I think it actually would take the bounding box of the whole annotation, including the text and the "target" positions.

If you know how to do it correctly, let me know or feel free to create a PR.

I see your point.

Respectfully, I might suggest that this is not necessary. Does one want to be moving the location of the target? I would not think so. And I would suggest that adjust_text should not move the entire annotation but just the text.

I have found that adjust_text works perfectly on annotations (at least ones without the arrows) so long as the xytext argument is not used. Using that argument seems to switch the coordinate system of the annotation and cause unexpected results.

But then what's the advantage over using text?

Ah, yes. I prefer it because I like the text moved slightly away from the point for aesthetic reasons. With annotation, you can specify an offset (xytext) of the position in points/pixels/font size (textcoords). The use of text coordinates creates a more consistent offset across multiple plots. Using the data coordinates, the offset would have to change based on the scale of the specific data. Annotations make this easy. I'm sure you can do it with text as well, but it's more difficult.

I have found that by setting {"xytext" : None, "textcoords" : None} you can use adjust_text perfectly fine. This is my current workflow. And it certainly could be argued that they should not used together as they are both arranging the position of the text in relation to the point they are labeling.

Could you share a small code example showing this?