Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在matplotlib中创建作用于旋转方向的自定义混合_变换?_Python_Matplotlib_Affinetransform - Fatal编程技术网

Python 如何在matplotlib中创建作用于旋转方向的自定义混合_变换?

Python 如何在matplotlib中创建作用于旋转方向的自定义混合_变换?,python,matplotlib,affinetransform,Python,Matplotlib,Affinetransform,我正在开发一个python GUI,它在matplotlib画布上绘制许多线、箭头和矩形。 矩形与直线对齐:直线上方旋转的矩形 这是照片。 我想在矩形上设置一个变换,这样垂直于直线的边的长度以轴坐标单位(transAxes)表示,平行于直线的边以数据坐标单位(transData)表示 我知道混合_变换可用于定义x轴和y轴的不同变换。这是类似的,但应用变换的方向不一定是水平和垂直方向。有没有一种方法可以定义在旋转方向而不是x-y方向上工作的自定义混合变换?在尝试创建自定义转换时,有关转换的文档不

我正在开发一个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方向上不再有数据坐标。除非定义一个更复杂的变换来更新自身,类似于。