Невозможно повернуть объект патча matplotlib относительно определенной точки с помощью rotate_deg_around ()

Я хочу повернуть объект прямоугольного патча matplotlib около его нижнего левого угла, используя функцию rotate_deg_around (). Однако патч всегда вращается вокруг какой-то другой точки. Любая идея, почему функция rotate_deg_around () не создает желаемый результат?

Мой код выглядит следующим образом:

f,(ax1) = plt.subplots(1,1,figsize=(6,6))
f.subplots_adjust(hspace=0,wspace=0)

ts = ax1.transData
coords = ts.transform([1,1])
tr = mpl.transforms.Affine2D().rotate_deg_around(coords[0], coords[1], 10)
t = ts + tr
rec0 = patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='r',facecolor='none')
ax1.add_patch(rec0)
#Rotated rectangle patch
rect1 = patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='b',facecolor='none',transform=t)
ax1.add_patch(rect1)
# Rectangles lower left corner
plt.plot([1], [1], marker='o', markersize=3, color="green")

plt.grid(True)
ax1.set_xlim(0,6)
ax1.set_ylim(-1,4)

что приводит к следующему рисунку:

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

Я следил за Unable, чтобы повернуть патч-объект matplotlib о конкретной точке, используя rotate_around ()

Буду признателен за любую оказанную помощь.

python,matplotlib,

2

Ответов: 1


2 принят

Короткий ответ: вам нужно изменить пределы оси перед выполнением преобразований. Кроме того, вы поворачиваете вокруг точки на холсте, которая была в положении (1,1)(верхний правый угол), прежде чем устанавливать пределы для чего-то другого.


Лучший ответ на самом деле следующий: для того, чтобы вращаться вокруг точки в координатах данных, нельзя использовать отображаемые координаты для определения центра вращения, но точно данные сами по себе.

Поэтому вместо того, чтобы сначала преобразовывать в отображение координат и затем вращать, сначала нужно повернуть, а затем преобразовать в отображаемые координаты

ts = ax1.transData
coords = [1,1]
tr = matplotlib.transforms.Affine2D().rotate_deg_around(coords[0],coords[1], 10)
t = tr + ts

Полный код (где не имеет значения, установлены ли и где установлены ограничения по оси, и которые не зависят от изменения размера изображения и т. Д.):

import matplotlib.pyplot as plt
import matplotlib

f,(ax1) = plt.subplots(1,1,figsize=(3,3))
f.subplots_adjust(hspace=0,wspace=0)


ts = ax1.transData
coords = [1,1]
tr = matplotlib.transforms.Affine2D().rotate_deg_around(coords[0],coords[1], 10)
t = tr + ts
rec0 = matplotlib.patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='r',facecolor='none')
ax1.add_patch(rec0)
#Rotated rectangle patch
rect1 = matplotlib.patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='b',facecolor='none',transform=t)
ax1.add_patch(rect1)
# Rectangles lower left corner
plt.plot([1], [1], marker='o', markersize=3, color="green")

plt.grid(True)
ax1.set_xlim(0,6)
ax1.set_ylim(-1,4)

plt.show()

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

питон, Matplotlib,
Похожие вопросы