- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在测量一些系统性能数据以将其存储在数据库中。根据这些数据点,我绘制了随时间变化的折线图。就其本质而言,这些数据点有点嘈杂,即。每个点都至少偏离局部平均值一点点。从一个点到下一个点直接绘制折线图时,会产生锯齿状的图形。在较大的时间尺度(如每个像素 > 10 个数据点)中,此噪声被压缩到一个宽的锯齿状线区域,即 20 像素高而不是较小尺度中的 1 像素。
我读过有关线条平滑、抗锯齿、简化以及所有这些内容的内容。但我发现的一切似乎都与其他事情有关。
我不需要消除锯齿,.NET 在屏幕上绘制线条时已经为我完成了。
我不想简化。我需要让极端值保持可见,至少其中大部分是可见的。
我认为它沿着样条曲线的方向发展,但我找不到太多示例图像来评估所描述的东西是否是我想要的。不过,我确实在 Google Books 上找到了一本高度科学的书,里面全是半页长的公式,我现在不想通读...
举个例子,看看 Linux/Gnome 的系统监视器应用程序。我用平滑线绘制了最近的 CPU/内存/网络使用情况。这可能有点过于简单,但我会尝试一下,看看是否可以对其进行调整。
我更喜欢 C# 代码,但其他语言的算法或代码也很好,只要我可以在没有外部引用的情况下将它移植到 C#。
最佳答案
您可以进行一些数据平滑处理。不使用真实数据,而是应用一种简单的平滑算法,像 Savitzky-Golay 滤波器一样保持峰值。
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 = 点数越大,你的数据就越平滑。但是您也会降低峰值准确度,但当简单地将一些点平均在一起时不会那么多。
关于c# - 如何绘制平滑/圆角/曲线图? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4388911/
我正在测量一些系统性能数据以将其存储在数据库中。根据这些数据点,我绘制了随时间变化的折线图。就其本质而言,这些数据点有点嘈杂,即。每个点都至少偏离局部平均值一点点。从一个点到下一个点直接绘制折线图时,
我是一名优秀的程序员,十分优秀!