#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'
)