Figure.transFigure.transform():图形坐标中的线条不随图形缩放

时间:2017-12-21 08:57:55

标签: python matplotlib

我正在尝试使用Figure.transFigure.transform()功能在图形坐标中绘制线条,但要么我不完全理解它,要么出现其他问题。根据{{​​3}},transFigure应为

  

图的坐标系; (0,0)位于左下方   图中,(1,1)位于图的右上角。

但是,如果我编写一个小测试程序,应该从Figure(而不是Axes)的左下角到右上角画一条对角线,这只能正确绘制线条在原始图中。调整图形大小后,线条不会再在右上角结束。在一个小的测试程序下面来说明这种行为:

from matplotlib import pyplot as plt
from matplotlib import lines
import numpy as np

x = np.linspace(0,1,100)

X = np.array([0.0,1.0])
Y = np.array([0.0,1.0])

fig, ax = plt.subplots()

ax.plot(x, np.cos(x))
X0, Y0 = fig.transFigure.transform([X,Y])

line1 = lines.Line2D(X0, Y0, color='r', lw = 5)
fig.lines.append(line1)

plt.show()

...以及任意调整后的结果数字:

Matplotlib Documentation

1 个答案:

答案 0 :(得分:2)

请注意,您在此处以像素坐标创建静态线。它的范围始终为(0,0)到(x1,y1)像素,其中(x1,y1)是原始图的右上角。

通常需要的是在图形坐标中创建一条从(0,0)到(1,1)的直线。因此,不会手动转换点,而是让fig.transFigure进行转换,如

line1 = lines.Line2D([0,1], [0,1], transform=fig.transFigure)

完整示例:

from matplotlib import pyplot as plt
from matplotlib import lines
import numpy as np

x = np.linspace(0,1,100)

X = np.array([0.0,1.0])
Y = np.array([0.0,1.0])

fig, ax = plt.subplots(figsize = (5,5), dpi = 100)

ax.plot(x, np.cos(x))

line1 = lines.Line2D(X, Y, color='r', lw = 5, transform=fig.transFigure)
fig.lines.append(line1)

plt.show()

enter image description here

这会产生与问题中相同的情节,但其优点是您不需要自己进行任何变换,并且您可以轻松地缩放或调整它。