Этот вопрос очень полезен, в частности, ответ @Mr 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)
![rotated plot](https://i.stack.imgur.com/6I8Yf.png)
Дополнительный вопрос : Что если нам просто понадобятся числовые значения повернутых точек?
Тогда подход 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), что согласуется с моим графиком повернутого графика выше.
Таким образом, вы можете вращать любую точку, которая вас интересует или напишите al oop, чтобы поймать их всех.