平滑堆积线图
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");
我有一个 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
:
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");