Как создать пользовательский blended_transform в matplotlib, который действует в повернутых направлениях? - PullRequest
2 голосов
/ 09 мая 2019

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

Вот изображение.

Я хочу установить преобразование для прямоугольника, чтобы длина стороны, перпендикулярной линии, была в единицах координат осей (transAxes), а стороны, параллельные линии, - в единицах координат данных (transData).

Я знаю, что blended_transform может использоваться для определения различных преобразований для оси x и оси y. Это аналогично, но направления, в которых применяются преобразования, не обязательно горизонтальное и вертикальное направление. Есть ли способ определения пользовательского смешанного преобразования, которое работает в повернутых направлениях вместо направлений x-y? Документация по трансформациям не очень полезна при создании пользовательского.

Спасибо!

1 Ответ

1 голос
/ 10 мая 2019

Вопросы в комментариях остались без ответа, поэтому необходимо сделать некоторые предположения. Допустим, вращение должно происходить в пространстве отображения, а координаты осей совпадают с координатами оси Y. Тогда возможное преобразование может выглядеть как

trans = ax.get_xaxis_transform() + mtrans.Affine2D().rotate_deg(angle)

В этом случае первое измерение - это координаты данных, второе - координаты осей.

Пример:

import matplotlib.pyplot as plt
import matplotlib.transforms as mtrans

fig, ax = plt.subplots()
angle = 38 # degrees
trans = ax.get_xaxis_transform() + mtrans.Affine2D().rotate_deg(angle)

ax.plot([5,9],[0,0], marker="o", transform=trans)

rect = plt.Rectangle((5,0), width=4, height=0.2, alpha=0.3,
                     transform=trans)
ax.add_patch(rect)

ax.set(xlim=(3,10))
plt.show()

enter image description here

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

import matplotlib.pyplot as plt
import matplotlib.transforms as mtrans

fig, ax = plt.subplots()
ax.set(xlim=(3,10),ylim=(4,10))
fig.canvas.draw()


angle = 38 # degrees
x, y = ax.transData.transform((5,5))
_, yax = ax.transAxes.inverted().transform((0,y))
transblend = ax.get_xaxis_transform()
x, y = transblend.transform((5,yax))

trans = transblend + mtrans.Affine2D().rotate_deg_around(x,y, angle)

ax.plot([5,9],[yax,yax], marker="o", transform=trans)

rect = plt.Rectangle((5,yax), width=4, height=0.2, alpha=0.3,
                     transform=trans)
ax.add_patch(rect)


plt.show()

Обратите внимание, что это делает недействительным, как только вы измените пределы или размер фигуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...