Matplotlib:旋转一个补丁
我想在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()