我正在测量一些系统性能数据,以便将其存储在数据库中。根据这些数据点,我绘制了随时间变化的折线图。在他们的本质上,这些数据点是有点嘈杂的,即。每一个点都至少偏离局部平均值一点。当从一个点到另一个点直接绘制折线图时,它会生成锯齿图。在一个大的时间尺度上,比如每像素> 10个数据点,这个噪声被压缩到一个宽的锯齿状的线条区域,比如说,20px高,而不是在更小的尺度上的1px。
我读过关于线条平滑,抗锯齿,简化和所有这些东西。但我发现的一切似乎都与其他东西有关。
我不需要抗锯齿,在屏幕上绘制线条时,.NET已经为我做过了。
我不想简单化。我需要极值保持可见,至少是大多数极值。
我认为它是在样条曲线的方向上进行的,但我找不到太多的示例图像来评估所描述的东西是否是我想要的。我确实在Google Books上找到了一本很科学的书,里面满是半页长的公式,我现在都不想读了……
举个例子,看看Linux/Gnome的系统监视器应用程序。我用平滑的线条绘制了最近的CPU/内存/网络使用情况。这可能有点过于简单,但我会试一试,看看我是否可以调整它。
我更喜欢C#代码,但算法或其他语言的代码也可以,只要我可以将其移植到C#而不需要外部引用。
发布于 2010-12-09 00:32:40
你可以做一些数据平滑。不使用真实数据,而是应用简单的平滑算法来保持峰值,就像Savitzky-Golayfilter一样。
You can get the coefficients here。
最简单的方法是:
取我链接到的网站上的前几个系数:
// 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//现在,对于数据中的每个点,您都会计算一个平滑点:
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;当使用5个点时,前2个点和最后2个点不能平滑。
如果你想让你的数据更加“平滑”,你可以用更大的数据点来试验系数。
现在,您可以通过“平滑”数据绘制一条线。np =点数越大,数据就越平滑。但你也会失去峰值精度,但当简单地将一些点平均在一起时,就不会失去那么多了。
发布于 2010-12-09 00:04:29
您无法在图形代码中修复此问题。如果你的数据是有噪声的,那么无论你使用哪种线条平滑算法,图形也会有噪声。您需要首先过滤数据。使用从原始数据插值的点创建第二个数据集。最小二乘拟合是一种常用的技术。平均很容易实现,但往往会隐藏极端情况。
发布于 2010-12-08 23:08:20
我认为你正在寻找的是一个提供“样条线”的例程。这里有一个描述样条线的链接:
http://en.wikipedia.org/wiki/Spline_(mathematics)
如果是这样的话,我没有任何关于样条库的建议,但最初在谷歌上搜索发现了一堆。
很抱歉没有代码,但希望了解这些术语会对您的搜索有所帮助。
鲍勃
https://stackoverflow.com/questions/4388911
复制相似问题