Python 如何在matplotlib中创建作用于旋转方向的自定义混合_变换?
我正在开发一个python GUI,它在matplotlib画布上绘制许多线、箭头和矩形。 矩形与直线对齐:直线上方旋转的矩形 这是照片。 我想在矩形上设置一个变换,这样垂直于直线的边的长度以轴坐标单位(transAxes)表示,平行于直线的边以数据坐标单位(transData)表示 我知道混合_变换可用于定义x轴和y轴的不同变换。这是类似的,但应用变换的方向不一定是水平和垂直方向。有没有一种方法可以定义在旋转方向而不是x-y方向上工作的自定义混合变换?在尝试创建自定义转换时,有关转换的文档不是很有帮助Python 如何在matplotlib中创建作用于旋转方向的自定义混合_变换?,python,matplotlib,affinetransform,Python,Matplotlib,Affinetransform,我正在开发一个python GUI,它在matplotlib画布上绘制许多线、箭头和矩形。 矩形与直线对齐:直线上方旋转的矩形 这是照片。 我想在矩形上设置一个变换,这样垂直于直线的边的长度以轴坐标单位(transAxes)表示,平行于直线的边以数据坐标单位(transData)表示 我知道混合_变换可用于定义x轴和y轴的不同变换。这是类似的,但应用变换的方向不一定是水平和垂直方向。有没有一种方法可以定义在旋转方向而不是x-y方向上工作的自定义混合变换?在尝试创建自定义转换时,有关转换的文档不
谢谢 评论中的问题没有得到回答,因此需要做出一些假设。假设旋转发生在显示空间,轴坐标是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()
相反,如果希望围绕数据坐标中的点旋转,则单个变换不起作用。例如,对于数据空间中围绕(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()
请注意,一旦更改限制或图形大小,这将失效。我认为很明显,没有能够满足要求的混合坐标系,因为这两个系统将通过旋转进行耦合。那么旋转是在轴还是数据坐标中发生的呢?如何定义非方轴内的旋转轴坐标?您所说的混合变换很有意义。有没有其他方法可以满足我的需要?我在文档中看到过非常复杂的变换,所以如果没有办法的话,我会感到惊讶。谢谢,这正是我想要的。使用相同的变换,这可以进一步扩展到多边形而不是矩形,对吗?是的,它可以是任何东西,x坐标是数据,y是轴,然后,所有的物体都以角度旋转。您可能会遇到轴限制的问题,但这是这个简单解决方案的固有特性。再次感谢。最后一个问题:如果我想在数据坐标空间中的给定点上定位条的第一个点(比如(5,5)),我应该在数据坐标中使用平移变换。这应该在旋转变换之前还是之后进行?y方向上不再有数据坐标。除非定义一个更复杂的变换来更新自身,类似于。