马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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的数隔开。如果你的数据不满足这个条件,你可能需要调整查找波峰和计算宽度的方法。
|