如何让Pyplot在曲线图中识别高原(几乎为0斜率),然后打印高原的ydata值?

时间:2013-09-23 22:59:59

标签: python matplotlib

我有一个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。

2 个答案:

答案 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似乎是最合适的。