私の解決策は、散布図の x の最小値と最大値に基づいて、各傾向線の最初と最後に追加のデータポイントを追加することです。
これは、
- トレンドラインの傾きを計算する
- トレンドラインの切片の計算
- 散布図で x の最小値を取得する
- 散布図で x の最大値を取得する
- 勾配、切片、最小 x 値を使用して最小 y 値を計算する
- 勾配、切片、最大 x 値を使用して最大 y 値を計算する
- x と y の値を持つ 2 つのポイントをトレンドラインに追加する
次のコード スニペットは、2 つのトレンドラインに始点と終点を追加し、その後に勾配と切片を計算する単純な関数を追加します。
if (Chart1.Series["Budget Year"].Points.Count > 2 && Chart1.Series["Actual Last Year"].Points.Count > 2)
{
Chart1.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "Linear,0,false,false", Chart1.Series["Budget Year"], Chart1.Series["Trendline (Budget Year)"]);
Chart1.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "Linear,0,false,false", Chart1.Series["Actual Last Year"], Chart1.Series["Trendline (Actual Last Year)"]);
double budgetSlope = Utility.GetSlope(Chart1.Series["Trendline (Budget Year)"].Points[0], Chart1.Series["Trendline (Budget Year)"].Points[1]);
double lastYearSlope = Utility.GetSlope(Chart1.Series["Trendline (Actual Last Year)"].Points[0], Chart1.Series["Trendline (Actual Last Year)"].Points[1]);
double budgetIntercept = Utility.GetIntercept(Chart1.Series["Trendline (Budget Year)"].Points[0], Chart1.Series["Trendline (Budget Year)"].Points[1]);
double lastYearIntercept = Utility.GetIntercept(Chart1.Series["Trendline (Actual Last Year)"].Points[0], Chart1.Series["Trendline (Actual Last Year)"].Points[1]);
double minBudgetRevenue = Convert.ToDouble(dt.Select("RevCurrBudget = MIN(RevCurrBudget)")[0]["RevCurrBudget"]);
double maxBudgetRevenue = Convert.ToDouble(dt.Select("RevCurrBudget = MAX(RevCurrBudget)")[0]["RevCurrBudget"]);
double minLastYearRevenue = Convert.ToDouble(dt.Select("RevPrevActual = MIN(RevPrevActual)")[0]["RevPrevActual"]);
double maxLastYearRevenue = Convert.ToDouble(dt.Select("RevPrevActual = MAX(RevPrevActual)")[0]["RevPrevActual"]);
double minBudgetEBIT = (budgetSlope * minBudgetRevenue) + budgetIntercept;
double maxBudgetEBIT = (budgetSlope * maxBudgetRevenue) + budgetIntercept;
double minLastYearEBIT = (lastYearSlope * minLastYearRevenue) + lastYearIntercept;
double maxLastYearEBIT = (lastYearSlope * maxLastYearRevenue) + lastYearIntercept;
Chart1.Series["Trendline (Budget Year)"].Points.InsertXY(0, minBudgetRevenue, minBudgetEBIT);
Chart1.Series["Trendline (Budget Year)"].Points.AddXY(maxBudgetRevenue, maxBudgetEBIT);
Chart1.Series["Trendline (Actual Last Year)"].Points.InsertXY(0, minLastYearRevenue, minLastYearEBIT);
Chart1.Series["Trendline (Actual Last Year)"].Points.AddXY(maxLastYearRevenue, maxLastYearEBIT);
}
public static double GetSlope(DataPoint pt1, DataPoint pt2)
{
return GetSlope(pt1.XValue, pt1.YValues[0], pt2.XValue, pt2.YValues[0]);
}
public static double GetSlope(double x1, double y1, double x2, double y2)
{
return (y2 - y1) / (x2 - x1);
}
public static double GetIntercept(DataPoint pt1, DataPoint pt2)
{
double slope = GetSlope(pt1, pt2);
double y = pt1.YValues[0];
double x = pt1.XValue;
return y - (slope * x);
}