Matplotlib:旋转贴片

Mer*_*moz 14 python matplotlib

我想在matplotlib中旋转一个Rectangle,但是当我应用转换时,矩形不再显示:

rect = mpl.patches.Rectangle((0.0120,0),0.1,1000)
t = mpl.transforms.Affine2D().rotate_deg(45)
rect.set_transform(t)
Run Code Online (Sandbox Code Playgroud)

这是一个已知的错误还是我犯了错误?

Nic*_*ick 18

提供的代码中的补丁很难说明发生了什么,所以我已经清楚地演示了我从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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @OlhaPavliuk我相信这是因为 x 和 y 轴的缩放比例不完全相同。请注意,网格显示矩形而不是正方形。 (4认同)
  • 谢谢,代码很棒!你能解释一下为什么红色矩形不再是矩形,而是平行四边形(视觉上角度不是 90°)?这是一些 matplotlib 特定的逻辑吗? (2认同)

mjh*_*jhm 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()
Run Code Online (Sandbox Code Playgroud)