c# - 从 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]);
}
}
}
}
解决方案
我认为问题的本质是“你如何定义‘高峰’?”
Emanuele 建议它是高于其两侧点的任何点,但在典型的锯齿状股市图表中,这几乎可能是所有其他点。大多数山脉每隔几英尺(或几英寸)就有一些比周围环境高的小岩石,但不会被视为山峰。
您可以应用平滑函数,将每个点重新计算为两侧几个点的平均值 - 然后寻找峰值。那么问题是你需要多少平滑。
或者你可以决定只有当它们之间有一个低点时才算一个峰值。同样,您需要确定该值是什么;是减少 10%,还是低于平均水平或其他?
一种方法是尝试上述任何一种方法,然后计算峰值。如果有很多峰,则应用更多的平滑或过滤,直到最大的峰突出。
基本上,峰值检测是人类不假思索地进行的那种模糊模式匹配,但很难描述我们真正的意思。
推荐阅读
- javascript - Laravel 6 应用程序中的非数值错误
- sql - 由 SQL 作业执行时 SSIS 包失败
- javascript - React - 在其自己的声明中获取组件的属性以在另一个属性中使用其值?
- asp.net - MVC/Core 应用程序和 Web 窗体应用程序之间的无缝登录
- kubernetes - Kubernetes 动态设置服务注解值
- javascript - Javascript调用方法没有相同的上下文
- azure-data-factory - 使用源为 REST 服务的复制数据活动时触发重试的原因
- php - 使用 php preg_replace 替换整个字符串,如果字符串是较长字符串的一部分,则不替换
- ruby - CSV 如何根据用户选择删除行
- matlab - 有没有一种方法可以使用 Matlab 中的 if/else 语句自动将文件从不同位置移动?