2016-08-10 130 views
0

我有一個c#Windows窗體應用程序,它使用標準的MS Chart控件生成一個堆積折線圖,如下例所示。平滑堆積折線圖

有沒有通過格式化系列或其他屬性來「平滑」行的方法?

看MSDN和谷歌我似乎無法找到一個方法來做到這一點,在Excel中有一個series.Smooth屬性...

我有我錯過了或者是沒可能?

+1

嘗試'SplineArea'圖表類型。 – jsanalytics

+0

如果您想擺脫尖角的邊緣,您可以計算數據點並將所有者繪製爲由曲線和線組成的填充曲線。 [Here](http://stackoverflow.com/questions/38175238/stackedbar-borders-between-different-series/38261691?s=1|0.3676#38261691)是計算堆積座標的一個例子.. – TaW

+0

@jstreet,不幸的是,這不是一個堆積圖,否則它會很棒,但結果看起來很有趣!感謝您的建議。 – Adrian

回答

1

如果你喜歡SplineAreas的平滑外觀,你可以計算出必要的值得到的只是那樣子:

enter image description here

的幾個注意事項:

  • 我已經顛倒了這一系列的順序;很多方法可以讓顏色正確的。(而不是一個大概應該在反向累加)
  • 堆疊DataPoints需要被對準,像往常一樣和任何DataPoints應該有自己Y-Values0
  • 當然,在新系列中,您無法再訪問實際的數據值,因爲您現在已經有了累計值;至少不是沒有扭轉對策。所以如果需要他們讓他們在某個地方。新DataPoints' Tag屬性是一個選項..
  • 您可以通過設置LineTension自定義屬性控制每個Series的「平滑度」:

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

enter image description here 以下是完整的示例代碼創建以上屏幕截圖計算'堆疊'SplineArea chart2來自數據中的數據StackedArea chart1

// 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");