如何绘制平滑/圆角/曲线图?(C#)

ygo*_*goe 7 c# curve smooth graph line

我正在测量一些系统性能数据以将其存储在数据库中.从这些数据点我随着时间的推移绘制线图.就其性质而言,这些数据点有点嘈杂,即.每个点都偏离本地平均值至少一点.当直线从一个点绘制到下一个点时,它会产生锯齿状图形.在每个像素大于10个数据点的大时间尺度下,这种噪声被压缩成宽的锯齿状线区域,例如,20px高而不是1px,如在较小的比例中.

我已经阅读过有关线条平滑,抗锯齿,简化以及所有这些内容的内容.但我发现的一切似乎都与其他东西有关.

我不需要抗锯齿,.NET在屏幕上绘制线条时已经为我做了这个.

我不想简化.我需要极端值才能保持可见,至少大部分都是如此.

我认为它是在样条曲线的方向,但我找不到很多示例图像来评估所描述的东西是否是我想要的.我确实在谷歌图书上找到了一本高度科学的书,里面装满了半页长的公式,我现在还不喜欢这本书......

举个例子,看看Linux/Gnome的系统监视器应用程序.我使用平滑的线条绘制最近的CPU /内存/网络使用情况.这可能有点过于简单,但我会试一试,看看我是否可以调整它.

我更喜欢C#代码,但其他语言的算法或代码也很好,只要我可以在没有外部引用的情况下将其移植到C#.

GvS*_*GvS 6

您可以进行一些数据平滑.而不是使用真实数据,应用一个简单的平滑算法,使峰值像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 =点数越大,数据越平滑.但是你也放松了峰值准确度,但是在简单地将一些点平均在一起时并没有那么多.