Исправлен сдвиг, примененный к текстовым координатам с помощью matplotlib

Я пишу функцию на основе matplotlib.pyplot, которая имитирует академические сюжеты, то есть с осями стрелок и метками, слегка смещенными от каждой стрелки.

Я бы хотел разместить некоторый текст, смещенный от наконечников стрелок (например, на 10 пикселей вверх или вправо), и этот сдвиг был бы постоянным, а именно независимым от соотношения сторон, subplots_adjust, xlim или даже размера окна рисунка.

С:

fig=plt.figure()
ax=fig.add_subplot(111)

Я пробовал до сих пор:

  • fig.text: просто плохо при изменении полей с помощью subplots_adjust
  • ax.text: неплохо, но смещение меняется при изменении размера окна...
  • ax.annotate: никакой заметной разницы с ax.text...

Две последние попытки основаны на смещении 10x10 пикселей, рассчитанном следующим образом:

ax.transAxes.inverted().transform((10,10)) - ax.transAxes.inverted().transform((0,0))

и clip_on=False (или annotation_clip=False) конечно.

Я также попытался посмотреть на преобразование, примененное к меткам тиков, поскольку их смещение от шипов ведет себя так, как я ищу, но я не нахожу деталей, стоящих за их CompositeGenericTransform.

Любая помощь будет оценена по достоинству.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

matplotlib.transforms.offset_copy выполняет свою работу.

Но поскольку мне нужно, чтобы это смещение применялось к нескольким преобразованиям, я использовал другое решение (хотя и не сильно отличающееся).

Создадим два перевода:

# 0.1in translation along x axis
offsetX=matplotlib.transforms.ScaledTranslation(.1,  0, fig.dpi_scale_trans)
# 0.1in translation along y axis
offsetY=matplotlib.transforms.ScaledTranslation( 0, .1, fig.dpi_scale_trans)

Затем, чтобы разместить текст на 0,1 дюйма справа от оси x и над осью y:

ax.text( 1, 0, "X-axis", transform=ax.transAxes + offsetX )
ax.text( 0, 1, "Y-axis", transform=ax.transAxes + offsetY )

и некоторый текст справа и ниже (x0,y0) в координате данных:

ax.text( x0, y0, "Some text", ha='left', va='top', transform=ax.transData + offsetX - offsetY)

Другие вопросы по теме