马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import matplotlib.pyplot as plt
data = [1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6.5, 7, 8, 9, 10, 9, 8, 7.5, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3.5, 4, 4.5, 5, 6, 7, 8, 9, 10, 11, 10.5, 10, 9.5, 9, 8, 7, 6, 5, 4.5, 4, 3, 2, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 5, 4, 3.5, 3, 2, 1, 1, 1, 1, 1]
print(data)
plt.plot(data)
plt.show()
---------------------------------------------------------
比如像上面这个列表, 画折线图出来可以看到有3个波, 就是要求出每个波的波峰(10, 11, 9)和每个波的宽度(就是波峰到2中间一半的位置的波的X轴的间隔)
这个问题的关键在于找出列表中的"波峰",以及计算每个波的宽度。
找波峰的方法是通过查找列表中的局部最大值,即当前值比它旁边的两个值都大的值。我们也需要记住这个最大值的索引,因为这将帮助我们计算波的宽度。
计算波宽度的方法是找出波峰左右两侧第一个小于等于2的数的位置,然后用这两个位置的平均值减去波峰的位置。
以下是实现这个逻辑的Python代码:
import matplotlib.pyplot as plt
import numpy as np
# 输入数据
data = [1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6.5, 7, 8, 9, 10, 9, 8, 7.5, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3.5, 4, 4.5, 5, 6, 7, 8, 9, 10, 11, 10.5, 10, 9.5, 9, 8, 7, 6, 5, 4.5, 4, 3, 2, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 5, 4, 3.5, 3, 2, 1, 1, 1, 1, 1]
peaks = [] # 存储波峰的位置和高度
widths = [] # 存储波宽度
for i in range(1, len(data) - 1):
# 查找波峰
if data[i] > data[i-1] and data[i] > data[i+1]:
peak_index = i
peak_value = data[i]
peaks.append((peak_index, peak_value))
# 找出左侧第一个小于等于2的值
left = i - 1
while data[left] > 2 and left > 0:
left -= 1
# 找出右侧第一个小于等于2的值
right = i + 1
while data[right] > 2 and right < len(data) - 1:
right += 1
# 计算波宽度
width = abs((left + right)/2 - peak_index)
widths.append(width)
print("波峰位置和高度:", peaks)
print("波宽度:", widths)
plt.plot(data)
plt.scatter([peak[0] for peak in peaks], [peak[1] for peak in peaks], color='red') # 用红色标记出波峰
plt.show()
这个代码会输出每个波峰的位置和高度,以及每个波的宽度,并在图中以红色标记出波峰。
注意,这种方法的有效性取决于你的数据:它假设你的数据是典型的"波"形状,即每个波峰都被至少一个值小于等于2的数隔开。如果你的数据不满足这个条件,你可能需要调整查找波峰和计算宽度的方法。
|