首页 > 解决方案 > 从 CSV 数据文件中以 c# 绘制的图表中的峰值检测(查找两个峰值之间的距离)

问题描述

我正在使用 c# Visual Studio 2019 从 CSV 文件中绘制折线图,​​我得到了几个峰值。我想检测那些峰值并知道它们之间的距离。下面是我用于图表绘制的代码。我想在代码中添加一个增量函数来检测最高峰并获取它们之间的距离。

感谢您的关注

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Drawing;


namespace GraphDemo
{
    class Plot
    {
        public Plot(Read rr, ComboBox xBox, ComboBox yBox, Chart chart)
        {
            int indX = xBox.SelectedIndex;
            int indY = yBox.SelectedIndex;
            float[,] data = rr.get_Data();
            int nLines = rr.get_nLines();

            chart.Series.Clear(); //ensure that the chart is empty
            chart.Series.Add("Series0");
            chart.Series[0].ChartType = SeriesChartType.Line;

            chart.Legends.Clear();
            for (int j = 0; j < nLines; j++)
            {
                chart.Series[0].Points.AddXY(data[j, indX], data[j, indY]);
            }
        }
    }
}

标签: c#.netvisual-studiocharts

解决方案


我认为问题的本质是“你如何定义‘高峰’?”

Emanuele 建议它是高于其两侧点的任何点,但在典型的锯齿状股市图表中,这几乎可能是所有其他点。大多数山脉每隔几英尺(或几英寸)就有一些比周围环境高的小岩石,但不会被视为山峰。

您可以应用平滑函数,将每个点重新计算为两侧几个点的平均值 - 然后寻找峰值。那么问题是你需要多少平滑。

或者你可以决定只有当它们之间有一个低点时才算一个峰值。同样,您需要确定该值是什么;是减少 10%,还是低于平均水平或其他?

一种方法是尝试上述任何一种方法,然后计算峰值。如果有很多峰,则应用更多的平滑或过滤,直到最大的峰突出。

基本上,峰值检测是人类不假思索地进行的那种模糊模式匹配,但很难描述我们真正的意思。


推荐阅读