我想水平旋转折线图。到目前为止,我具有目标角度,但无法旋转图形阵列(污点中的蓝色图形)。

import matplotlib.pyplot as plt
import numpy as np

x = [5, 6.5, 7, 8, 6, 5, 3, 4, 3, 0]
y = range(len(x))
best_fit_line = np.poly1d(np.polyfit(y, x, 1))(y)

angle = np.rad2deg(np.arctan2(y[-1] - y[0], best_fit_line[-1] - best_fit_line[0]))
print("angle: " + str(angle))

plt.figure(figsize=(8, 6))
plt.plot(x)
plt.plot(best_fit_line, "--", color="r")
plt.show()


python - 如何按角度旋转python/numpy中的一维线图数组?-LMLPHP

数组的目标计算应如下所示(请忽略红线):

python - 如何按角度旋转python/numpy中的一维线图数组?-LMLPHP

如果您有任何建议,请告诉我。谢谢。

最佳答案

This question非常有帮助,特别是@Ms Tsjolder的回答。为了适应您的问题,我必须从计算出的角度减去90才能获得所需的结果:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import transforms

x = [5, 6.5, 7, 8, 6, 5, 3, 4, 3, 0]
y = range(len(x))
best_fit_line = np.poly1d(np.polyfit(y, x, 1))(y)

angle = np.rad2deg(np.arctan2(y[-1] - y[0], best_fit_line[-1] - best_fit_line[0]))
print("angle: " + str(angle))

plt.figure(figsize=(8, 6))

base = plt.gca().transData
rotation = transforms.Affine2D().rotate_deg(angle - 90)

plt.plot(x, transform = rotation + base)
plt.plot(best_fit_line, "--", color="r", transform = rotation + base)


python - 如何按角度旋转python/numpy中的一维线图数组?-LMLPHP



后续问题:如果只需要旋转点的数值该怎么办?

然后,matplotlib方法仍然有用。从上面介绍的rotation对象中,matplotlib可以提取转换矩阵,我们可以将其用于转换任何点:

# extract transformation matrix from the rotation object
M = transforms.Affine2DBase.get_matrix(rotation)[:2, :2]

# example: transform the first point
print((M * [0, 5])[:, 1])


[-2.60096617 4.27024297]

切片是为了获得我们感兴趣的尺寸,因为旋转仅在2D中发生。您可以看到原始数据的第一点已转换为(-2.6,4.3),与我上面旋转图的绘图一致。

这样,您可以旋转您感兴趣的任何点,或编写一个循环以捕获所有这些点。

关于python - 如何按角度旋转python/numpy中的一维线图数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61108618/

10-10 14:45
查看更多