matplotlib 中补丁的旋转未按预期运行

Tal*_*kly 1 python matplotlib

我正在尝试将旋转的矩形覆盖到 matplotlib 图表上。我有以下代码:

    fig = Figure((3.8, 3.4))
    subp = fig.add_subplot(111)
    
    fig.axes[0].set_autoscale_on(False)
    fig.axes[0].set_ylim([float(self.getConfig('GUI', 'chartmin', '-1')),float(self.getConfig('GUI', 'chartmax','4' ))])
    fig.axes[0].set_xlim([dataSet[0][2]/1000,dataSet[-1][2]/1000])
    fig.axes[0].yaxis.grid(True, which='major') 
    
    timevals = []
    dataPoints = []

#timevals and datapoints are then populated and added to chart correctly, code removed for easier reading

    subp.plot(timevals, dataPoints)
    rect = matplotlib.patches.Rectangle( ((dataSet[0][2]/1000)+3,0), width=1.5, height=3, alpha=0.50)
    rect2 = matplotlib.patches.Rectangle( ((dataSet[0][2]/1000)+3,0), width=1.5, height=3, color="red", alpha=0.50)
    
    t_start = subp.transData
    t = matplotlib.transforms.Affine2D().rotate_deg(-45)
    t_end = t_start + t  
    rect.set_transform(t_end)
    subp.add_patch(rect)
    subp.add_patch(rect2)
Run Code Online (Sandbox Code Playgroud)

dataSet[0][2]/1000)+3 给出图表时间序列的开始 + 3 秒

正在生成的图表的 y 值介于 0 和 4 之间,x 值可以是任何值(它是力 (y) 与时间 (x) 的关系图)。

上面的输出旨在使 rect2(蓝色)与 rect(红色)相同,但旋转了 45 度。我实际得到的是这样的:

这是预期的 45 度旋转,但也是平移,我尝试过 rotate_deg_around(0,0,-45) 但这似乎没有帮助。任何人都可以看到我在这里做错了什么,还是我误解了旋转的工作原理?

Fer*_*yer 6

默认情况下,旋转是相对于原点定义的。您不想围绕原点旋转蓝色矩形,而是围绕其中心点旋转。这与首先​​平移它使其中心位于原点,执行旋转,然后将其平移回来相同。

幸运的是,matplotlib 有一个方便的功能可以让您的生活更轻松:rotate_deg_around(x, y, degrees). 只需通过矩形的中心,你应该没问题。