我有一个Python程序,显示温度下降与时间的关系图。沿着下降,温度保持恒定一段时间,几乎为0斜率,然后继续下降。它的这个区域在曲线温度恒定时我希望程序自动检测并显示y值。稍后将该值放入等式中。我正试图找出如何做到这一点。我尝试过但失败了,我的最后一次尝试是:
import numpy as np
import matplotlib.pyplot as plt
list_of_files=[('logfile.txt', 'temp')]
datalist = [ ( np.loadtxt(filename), label ) for filename, label in list_of_files]
for data, label in datalist:
plt.plot( data[:0], data[:,1], label=label )
plt.ginput(n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pops=3, mouse_stop=2)
plt.show()
我希望高原上的鼠标点击会显示并保存y坐标,只是为了引导我向正确的方向进行编程。但是当我点击情节时,所有这一切都是一个简短的红色标记。我不想要鼠标点击....谢谢,Rico。
答案 0 :(得分:2)
遍历小块数据,确定块的斜率,返回符合条件的点
def zero_slope(data, chunksize = 3, max_slope = .001):
"""return the 'first' data point with zero slope
data --> numpy ndarray - 2d [[x0,y0],[x1,y1],...]
chunksize --> odd int
returns numpy ndarray
"""
midindex = chunksize / 2
for index in xrange(len(data) - chunksize):
chunk = data[index : index + chunksize, :]
# subtract the endpoints of the chunk
# if not sufficient, maybe use a linear fit
dx, dy = abs(chunk[0] - chunk[-1])
print dy, dx, dy / dx
if 0 <= dy / dx < max_slope:
return chunk[midindex]
答案 1 :(得分:0)
我会通过改善wwii的回答来回答。
def zero_slope(data, chunksize =4, max_slope = .04):
midindex = chunksize / 2
is_plateau = np.zeros((data.shape[0]))
for index in range(midindex, len(data) - midindex):
chunk = data[index - midindex : index + midindex]
# subtract the endpoints of the chunk
# if not sufficient, maybe use a linear fit
dy_dx = abs(chunk[0] - chunk[-1])/chunksize
print(dy, dx, dy / dx)
if (0 <= dy / dx < max_slope):
is_plateau[index] = 1.0
return is_plateau
is_plateau返回一个序列,其中1代表平稳,0代表没有平稳。我玩过很多max_slope值,而0.04似乎是最合适的。