我正在尝试使用Figure.transFigure.transform()
功能在图形坐标中绘制线条,但要么我不完全理解它或其他出错的地方。根据Matplotlib Documentation,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()
...以及任意调整大小后得到的数字:
请注意,您在此处以像素坐标创建静态线。它的范围始终为(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()
这会产生与问题中相同的情节,但优点是您不需要自己进行任何变换,并且可以轻松地缩放或调整它。