计算直线的角度(度)
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.43
、delta_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。
我正在尝试确定两点直线的角度,我在网上遇到了很多解决方案,但 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.43
、delta_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。