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

问题描述 投票:1回答:1

我正在尝试使用Figure.transFigure.transform()功能在图形坐标中绘制线条,但要么我不完全理解它或其他出错的地方。根据Matplotlib DocumentationtransFigure应该是

图的坐标系; (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()

...以及任意调整大小后得到的数字:

figure that results from the above code after resizing

python matplotlib
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.