python-3.x - 使用 Python 进行度角和矢量化
问题描述
每次我在新数据集上运行脚本时,角度线都会移动。每次读入新数据集时,我希望两条线的角度分别为 345(绿线)和 330(红线)度。
我的代码有什么问题?
结果应如下所示:
第一个数据集
data = np.array([10.79,10.87,10.94,10.95,11,11.5,10.89,11.45,11.94,12.17,12.45,12.09,13.65,13.5,13.25,13.18,13.28,
13.45,13.81,13.8,14.08,14.09,14.48,14.5,14.08,14.54,14.6,15.48,16,17.049999,17.219999,16.99,
17.23,17.200001,17.110001,18.190001,23.540001,22.25,21.15,22.09,22.85,21.4,21.41,20.780001,18.84,
18.389999,18.09,18.280001,17.959999,21.969999,21.120001,20.25,19.879999,21.309999,21.84])
第二个数据集
data = np.array([12.44,12.02,12.58,12.09,12,11.98,12.19,11.75,11.44,11.4,10.68,10.46,10.95,10.6,11.44,
10.6,10.41,10.3,11.45,12.5,12.65,11.62,11.45,11.16,10.8,12.5,12.23,13.99,12.49,13.49,12.69,12.72,
12.81,13.1,12.89,13.50,13.35])
脚本
import matplotlib.pyplot as plt
import numpy as np
import math
from scipy import signal
for number in data:
signal_max = (data > np.roll(data,1)) & (data > np.roll(data,-1))
signal_min = (data < np.roll(data,1)) & (data < np.roll(data,-1))
xm = np.argmax(data)
ym = np.amax(data)
angle1 = 345 # green
angle2 = 330 # red
x1, y1 = xm + len(data)-xm, ym + math.tan(angle1 * math.pi/180) * len(data)-xm
x2, y2 = xm + len(data)-xm, ym + math.tan(angle2 * math.pi/180) * len(data)-xm
plt.plot( [ xm, x1 ], [ym, y1 ], '-', color='g')
plt.plot( [ xm, x2 ], [ym, y2 ], '-', color='r')
plt.plot(data)
plt.show()
解决方案
在绘图上可视化角度时应该注意的一件事是绘图的纵横比。如果绘图的纵横比不相等,那么可视化的角度将不会像您期望的那样!
您可以将角度的绘图整理为:
angle1 = np.deg2rad(345) # green
angle2 = np.deg2rad(330) # red
x1, y1 = np.cos(angle1), np.sin(angle1)
x2, y2 = np.cos(angle2), np.sin(angle2)
plt.plot( [ xm, xm + x1 ], [ym, ym + y1 ], '-', color='g')
plt.plot( [ xm, xm + x2 ], [ym, ym + y2 ], '-', color='r')
为了确保相同的纵横比,您可以使用plt.gca().set_aspect('equal')
如果你想改变线条的长度,你可以引入一个比例变量:
scale = 2
x1, y1 = scale * np.cos(angle1), scale * np.sin(angle1)
x2, y2 = scale * np.cos(angle2), scale * np.sin(angle2)
因此,如果您希望线条到达数据的末尾,您可以设置
scale = data.size - xm
推荐阅读
- serverspec - 监听端口的 serverspec 测试失败
- amazon-web-services - AWS Redshift UNLOAD 成功完成,但 S3 中没有数据
- c# - TableLayoutPanel 列不会占用 100% 的宽度
- python - 如何在 Python 中从指定的数字开始对数字列表进行数字排序?
- c# - 如果输入与另一个数组的索引匹配,如何显示一个数组的索引?
- ruby-on-rails - 将用户每 30 天可以发送的请求限制为 3 个。Ruby on Rails
- python - 这是一个有效的 seq2seq lstm 模型吗?
- python-2.7 - 如何在 python 中处理日期时间变量?
- php - 在 SQL 插入查询中处理来自用户输入文本的引号
- php - 如何解决 PHP 应用程序 htaccess 上的无效请求(不支持的 SSL 请求)