计算直线的角度(度)

Calculate angle (degree) of a straight line

我正在尝试确定两点直线的角度,我在网上遇到了很多解决方案,但 none 对我有用,请考虑这段代码

import matplotlib.pyplot as plt
data = np.array([7405.,7447.4,7433.99,7410.,7443.15,7429.4,7590.03,7550.,7566.32,7619.62,7549.71,7551.8,7530,7522.99,7499.75,7453.99,7542.16,7564.,7552.77,7552])
y = [7606.672474,7570.240928]
plt.plot(data)
plt.plot([6,17], y)
plt.show()

目标线是y,光看应该是-5度左右。 似乎大多数在线解决方案都建议我们可以通过

找到角度
degree = np.math.atan2(y[-1] - y[0], x[-1] - x[0])
degree = np.degrees(degree)

为简单起见,我省略了 y 的其他值,仅保留第一个点和最后一个点,因此此处的 x[-1] - x[0] 部分将是 11=17-6,这是 y 线穿过 x 轴的长度,这是大多数在线解决方案所建议的,但是所有方法都未能为此获得正确的角度,我应该注意到在我的测试中,一些方法 似乎 为给定数据提供了正确的角度例如单元,而在

等不同的数据单元上完全失败
data = [52.3384984,53.04757978,52.04276249,51.77348257,49.93056673,52.24062341,55.74022485,60.77761392,60.89290148,60.1995072,60.40524964,59.00590344,59.67589831,56.49266698,49.02464746,51.53876823,57.77368203,59.48092106,56.63155446,56.0648491 ]
y = [51.337288,50.331895]
plt.plot(data)
plt.plot([3,15], y)
plt.show()

我也尝试过对数据进行最小-最大归一化,但没有成功,所以考虑到我们有一条线的第一个点和最后一个点及其长度,我们如何或者是否有可能确定它的角度(以度为单位)?

有两个角度你需要理解。第一个是根据数据计算的,第二个是根据图计算的。

第一个

你写的代码正在计算第一个:

degree = np.math.atan2(y[-1] - y[0], x[-1] - x[0])
degree = np.degrees(degree)

delta_y = y[-1] - y[0] = -36.43delta_x = x[-1] - x[0] = 11

degree = -73.20如果你在脑海中画一个三角形就完全有道理了。

第二个

但是,你可能会质疑我你在看-5度左右的线。这是第二个涉及计算显示比率的问题(注意 y 轴和 x 轴的单位长度不同,以英寸为单位)。在这里我找到了一个单独的问题来帮助你计算。

from operator import sub
def get_aspect(ax):
    # Total figure size
    figW, figH = ax.get_figure().get_size_inches()
    # Axis size on figure
    _, _, w, h = ax.get_position().bounds
    # Ratio of display units
    disp_ratio = (figH * h) / (figW * w)
    # Ratio of data units
    # Negative over negative because of the order of subtraction
    data_ratio = sub(*ax.get_ylim()) / sub(*ax.get_xlim())

    return disp_ratio / data_ratio

因此您需要该比率的倍数才能得到线端点的曼哈顿距离。

ax = plt.gca()
ratio = get_aspect(ax)
degree = np.math.atan2((y[-1] - y[0])*ratio, x[-1] - x[0])
degree = np.degrees(degree)

结果是-4.760350735146195,大约是-5。