Matplotlib:旋转一个图形补丁

19
我想在matplotlib中旋转一个矩形,但是当我应用变换时,矩形就不再显示了。
rect = mpl.patches.Rectangle((0.0120,0),0.1,1000)
t = mpl.transforms.Affine2D().rotate_deg(45)
rect.set_transform(t)

这是已知的错误还是我的错误?


你能详细说明一下问题吗?你在这里具体想做什么? - steabert
我想将一个“矩形”添加到我的“ax”中(这个操作很顺利),但是我希望它不是一个直角矩形,而是倾斜45度。最终目的是在轴上表示一个“切口”。 - Mermoz
2个回答

29

代码补丁让事情变得难以理解,所以我从Matplotlib示例中编写了一个清晰的演示:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib as mpl

fig = plt.figure()
ax = fig.add_subplot(111)

r1 = patches.Rectangle((0,0), 20, 40, color="blue", alpha=0.50)
r2 = patches.Rectangle((0,0), 20, 40, color="red",  alpha=0.50)

t2 = mpl.transforms.Affine2D().rotate_deg(-45) + ax.transData
r2.set_transform(t2)

ax.add_patch(r1)
ax.add_patch(r2)

plt.xlim(-20, 60)
plt.ylim(-20, 60)

plt.grid(True)

plt.show()

在此输入图片描述


1
我只是想夸赞你的回答非常清晰,准确地说明了该怎么做。谢谢。 - Ram Narasimhan
2
谢谢,代码很棒!你能解释一下为什么红色矩形不再是矩形,而是一个平行四边形(角度在视觉上不是90度)吗?这是一些特定于matplotlib的逻辑吗? - olha
6
我认为这是因为X和Y轴的比例不完全相同。请注意,网格显示的是矩形而不是正方形。 - Nick
1
添加 plt.gca().set_aspect('equal', adjustable='box')。 - decades

9

显然,对于补丁(patch)的变换是由多个变换组成的,以处理缩放和边界框。将变换添加到现有的绘图变换中似乎可以得到更符合预期的结果。尽管看起来还有一个偏移量需要解决。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib as mpl
fig = plt.figure()
ax = fig.add_subplot(111)

rect = patches.Rectangle((0.0120,0),0.1,1000)

t_start = ax.transData
t = mpl.transforms.Affine2D().rotate_deg(-45)
t_end = t_start + t

rect.set_transform(t_end)

print repr(t_start)
print repr(t_end)
ax.add_patch(rect)

plt.show()

我不明白为什么需要添加 ax.transData - Mermoz
我也很困惑。我本以为t_start = rect.get_transform()是正确的方法,但它也没有起作用。 - mjhm
1
我认为答案是正确的,所以我会添加这个评论来解释原因:之前无法工作的原因是,如果你附加一个没有变换的补丁,它会默认使用transData,正如你可以从add_path文档中看到的那样。所以如果你在之前设置了它,你需要将其添加到你的变换中。 @mjhm:如果你想要使用rect.get_transform()来获取t_start,那么你必须使用transform=选项创建矩形。 - steabert
如果您先执行ax.add_patch(rect),那么我认为rect.get_transform会很好用。 - Mad Physicist
1
当您为图形基元指定变换时,它会_替换_绘图系统默认使用的普通变换,以将用户坐标映射到显示器。因此,在进行变换后,您需要_添加_将已经转换的坐标映射到显示器的变换。 - holdenweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接