平滑堆积线图

smoothing stacked line graph

我有一个 c# Windows 表单应用程序,它使用标准的 MS 图表控件生成堆叠线图,如下例所示。

有没有办法通过格式化系列或其他 属性 来 "smoothing" 行?

查看 MSDN 和 Google 我似乎无法找到执行此操作的方法,在 Excel 中有一个 series.Smooth 属性...

我错过了还是不可能?

如果您喜欢 SplineAreas 的平滑外观,您可以计算获得该外观所需的值:

一些注意事项:

  • 我把系列的顺序颠倒了;有很多方法可以使颜色正确..(相反,可能应该反向累积)
  • 堆叠的DataPoints需要像往常一样对齐,任何DataPoints应该有他们的Y-Values 变为 0.
  • 当然,在新系列中,您无法再访问实际数据值,因为您现在拥有的是累计值;至少在不推翻计算的情况下。因此,如果需要,请将它们放在某个地方。新的 DataPoints' Tag 属性 是一个选项..
  • 您可以通过设置其 LineTension 自定义属性来控制每个 Series 的“平滑度”:

 chart2.Series[0].SetCustomProperty("LineTension", "0.15");

这是创建上述屏幕截图的完整示例代码,根据 StackedArea chart1:

中的数据计算 'stacked' SplineArea chart2
// preparation
for (int i = 0; i < 4; i++)
{
    Series s = chart1.Series.Add("S" + i);
    s.ChartType = SeriesChartType.StackedArea;

    Series s2 = chart2.Series.Add("S" + i);
    s2.ChartType = SeriesChartType.SplineArea;

}

for (int i = 0; i < 30; i++)   // some test data
{
    chart1.Series[0].Points.AddXY(i, Math.Abs(Math.Sin(i / 8f)));
    chart1.Series[1].Points.AddXY(i, Math.Abs(Math.Sin(i / 4f)));
    chart1.Series[2].Points.AddXY(i, Math.Abs(Math.Sin(i / 1f)));
    chart1.Series[3].Points.AddXY(i, Math.Abs(Math.Sin(i / 0.5f)));
}

// the actual calculations:

int sCount = chart1.Series.Count; 
for (int i = 0; i < chart1.Series[0].Points.Count ; i++)
{
    double v = chart1.Series[0].Points[i].YValues[0];
    chart2.Series[sCount - 1].Points.AddXY(i, v);
    for (int j = 1; j < sCount; j++)
    {
        v += chart1.Series[j].Points[i].YValues[0];
        chart2.Series[sCount - j - 1].Points.AddXY(i, v);
    }
}

// optionally control the tension:
chart2.Series[0].SetCustomProperty("LineTension", "0.15");