ygo*_*goe 7 c# curve smooth graph line
我正在测量一些系统性能数据以将其存储在数据库中.从这些数据点我随着时间的推移绘制线图.就其性质而言,这些数据点有点嘈杂,即.每个点都偏离本地平均值至少一点.当直线从一个点绘制到下一个点时,它会产生锯齿状图形.在每个像素大于10个数据点的大时间尺度下,这种噪声被压缩成宽的锯齿状线区域,例如,20px高而不是1px,如在较小的比例中.
我已经阅读过有关线条平滑,抗锯齿,简化以及所有这些内容的内容.但我发现的一切似乎都与其他东西有关.
我不需要抗锯齿,.NET在屏幕上绘制线条时已经为我做了这个.
我不想简化.我需要极端值才能保持可见,至少大部分都是如此.
我认为它是在样条曲线的方向,但我找不到很多示例图像来评估所描述的东西是否是我想要的.我确实在谷歌图书上找到了一本高度科学的书,里面装满了半页长的公式,我现在还不喜欢这本书......
举个例子,看看Linux/Gnome的系统监视器应用程序.我使用平滑的线条绘制最近的CPU /内存/网络使用情况.这可能有点过于简单,但我会试一试,看看我是否可以调整它.
我更喜欢C#代码,但其他语言的算法或代码也很好,只要我可以在没有外部引用的情况下将其移植到C#.
您可以进行一些数据平滑.而不是使用真实数据,应用一个简单的平滑算法,使峰值像Savitzky-Golayfilter一样.
最容易做的是:
从我链接到的网站获取顶部系数:
// For np = 5 = 5 data points
var h = 35.0;
var coeff = new float[] { 17, 12, -3 }; // coefficients from the site
var easyCoeff = new float[] {-3, 12, 17, 12, -3}; // Its symmetrical
var center = 2; // = the center of the easyCoeff array
Run Code Online (Sandbox Code Playgroud)
//现在,对于数据中的每个点,您都可以计算出平滑点:
smoothed[x] =
((data[x - 2] * easyCoeff[center - 2]) +
(data[x - 1] * easyCoeff[center - 1]) +
(data[x - 0] * easyCoeff[center - 0]) +
(data[x + 1] * easyCoeff[center + 1]) +
(data[x + 2] * easyCoeff[center + 2])) / h;
Run Code Online (Sandbox Code Playgroud)
使用5分时,前2点和后2点你需要平滑.
如果您希望数据更加"平滑",您可以尝试使用更大数据点的系数.
现在,您可以通过"平滑"数据绘制一条线.np =点数越大,数据越平滑.但是你也放松了峰值准确度,但是在简单地将一些点平均在一起时并没有那么多.