Matplotlib:旋转一个补丁

18 投票
3 回答
31000 浏览
提问于 2025-04-16 07:38

我想在matplotlib中旋转一个矩形,但当我应用这个变换后,矩形就不见了:

rect = mpl.patches.Rectangle((0.0120,0),0.1,1000)
t = mpl.transforms.Affine2D().rotate_deg(45)
rect.set_transform(t)

这是一个已知的bug,还是我哪里做错了呢?

3 个回答

1

虽然这个内容有点老了,但我还是想补充一下。你可以通过这个类自带的方法来旋转一个矩形。使用 set_angle 函数来设置旋转的角度,使用 rotation_point 属性来确定旋转的中心点。

from matplotlib.patches import Rectangle

rect1 = Rectangle(xy=(0, 0), width=2, height=1, color='blue')
rect2 = Rectangle(xy=(0, 0), width=2, height=1, angle=45, rotation_point='xy', color='red')
rect3 = Rectangle(xy=(0, 0), width=2, height=1, color='green')
rect3.set_angle(90)

旋转的矩形

注意,你还可以通过调用 rotation_point 方法轻松改变旋转的中心点。官方文档可以在 这里 找到。

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

在这里输入图片描述

9

看起来,补丁上的变换是为了处理缩放和边界框而组合起来的几个变换。把这个变换加到现有的图形变换上,似乎能得到更接近你预期的效果。不过,看起来还是有一些偏移需要解决。

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

撰写回答