如何在 matplotlib 中创建作用于旋转方向的自定义 blended_transform?

How to create a custom blended_transform in matplotlib that acts on rotated directions?

我正在开发一个 python GUI,可以在 matplotlib canvas 上绘制许多线条、箭头和矩形。 矩形与线对齐:线上方的旋转矩形

这是图片。

我想在矩形上设置一个变换,使垂直于直线的边的长度以轴坐标单位(transAxes)为单位,平行于直线的边以数据坐标单位(transData)为单位。

我知道 blended_transform 可用于定义 x 轴和 y 轴的不同变换。这很相似,但应用变换的方向不一定是水平和垂直方向。有没有一种方法可以定义适用于旋转方向而不是 x-y 方向的自定义混合变换?尝试创建自定义转换时,有关转换的文档不是很有帮助。

谢谢!

评论中的问题没有得到解答,所以需要做一些假设。假设旋转应该发生在显示 space 中,轴坐标是 y-axis 方向的坐标。然后可能的转换看起来像

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()

如果您想要围绕数据坐标中的一个点旋转,则单个变换无法完成这项工作。例如,数据 space、

中关于 (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()

请注意,一旦您更改限制或图形大小,这就会失效。