параметр only_move в adjust_text не работает для перекрытия последнего значения за пределами области графика?

#python #matplotlib

#python #matplotlib

Вопрос:

Я пытался использовать adjustText библиотеку для настройки двух аннотаций графика, которые перекрывались друг с другом. Я делаю что-то подобное:

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

foo = np.linspace(1, 100,  1000)
bar = np.linspace(1, 100.1, 1000)
x = np.linspace(0,1,1000)

w, h = plt.figaspect(9/16) 
fig = plt.figure(figsize=(w, h), dpi=300, frameon=False)
ax = plt.gca()

plt.xlim(x[0], x[-1])

ax.plot(x, foo, label='Foo', color='b')
plt.annotate(f'{foo[-1]}',
         xy = (1, foo[-1]),
         xytext=(8, 0), 
         xycoords=('axes fraction', 'data'),
         textcoords='offset points',
         color='b'
        )

ax.plot(x, bar, label='Bar', color='orange')
plt.annotate(f'{bar[-1]}',
         xy = (1, bar[-1]),
         xytext=(8, 0), 
         xycoords=('axes fraction', 'data'),
         textcoords='offset points',
         color='orange'
        )
 

В результате получается фигура с перекрывающимися аннотациями

Перекрывающиеся аннотации

Затем я попытался использовать adjust_text функцию и добавил следующие строки кода в исходный блок:

 annotations = [child for child in ax.get_children() if isinstance(child, matplotlib.text.Annotation)]
adjust_text(annotations,
            only_move={'points':'xy', 'text':'y', 'objects':'xy'},
            autoalign='y',
           )
 

А затем тексты перестали перекрываться друг с другом, но начали перекрываться со строками графика. Что я делаю не так?

Новое изображение

Комментарии:

1. Ваш код верен. Если вы хотите переместить текст по оси x, вы можете использовать следующий код. adjust_text(annotations, only_move={'points':'xy', 'text':'x', 'objects':'xy'},autoalign='x',)

2. Я не хочу перемещать тексты по оси x. Я хочу переместить их по оси y

3. Ваш код уже перемещается по оси y? Вам нужна определенная позиция по оси y.

4. Он перемещается по обеим осям. Я передал only_move dict, чтобы ограничить перемещение по оси x, но текст все равно перемещался по оси x. Мой вопрос касается любых ошибок, которые я, возможно, допустил, пытаясь ограничить движение только по оси y.

Ответ №1:

Я не знаком с библиотекой adjustText, поэтому я попробовал различные параметры и не получил ожидаемых результатов. Однако autoalign=’y’ оказал влияние. Затем я скорректировал положение на стороне matplotlib.

 ax.plot(x, foo, label='Foo', color='b')
plt.annotate(f'{foo[-1]}',
         xy = (1, foo[-1]),
         xytext=(20, 0), 
         xycoords=('axes fraction','data'),
         textcoords='offset points',
         color='b'
        )

ax.plot(x, bar, label='Bar', color='orange')
plt.annotate(f'{bar[-1]}',
         xy = (1, bar[-1]),
         xytext=(20, 0), 
         xycoords=('axes fraction','data'),
         textcoords='offset points',
         color='orange'
        )

annotations = [child for child in ax.get_children() if isinstance(child, matplotlib.text.Annotation)]
adjust_text(annotations,
            autoalign='y'
           )
 

введите описание изображения здесь