如何在 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()
请注意,一旦您更改限制或图形大小,这就会失效。
我正在开发一个 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()
请注意,一旦您更改限制或图形大小,这就会失效。