2D Chart for WinForms | ComponentOne
Charting Data / Working with TrendLines / Custom TrendLine
In This Topic
    Custom TrendLine
    In This Topic

    To implement a custom trendline a class implementing ICustomTrendLine interface must be created. The instance of this class is assigned to CustomTrendLine property of a TrendLine object. In this case all points of trendline must be fully defined by the class and TrendLineType property setting is not relevant. The following sample code implements a custom TrendLine that corresponds to data limits.

    To write code in Visual Basic

    Visual Basic
    Copy Code
            
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _   Handles Button1.Click       
            ' create trend line     
            Dim tl As C1.Win.C1Chart.TrendLine = _     
               c1Chart1.ChartGroups(0).ChartData.TrendsList.AddNewTrendLine()      
            ' setup line properties       
            tl.LineStyle.Thickness = 3      
            tl.LineStyle.Pattern = C1.Win.C1Chart.LinePatternEnum.Dash      
            ' set custom trend line      
            tl.CustomTrendLine = New CustomTrendLine()       
    End Sub
           
    Public Class CustomTrendLine_  Implements C1.Win.C1Chart.ICustomTrendLine       
      Private _x() As Double     
      Private _y() As Double     
      
            Public Sub Calculate(ByVal tl As C1.Win.C1Chart.TrendLine, ByVal x() As Double, _ ByVal y() As Double)Implements C1.Win.C1Chart.ICustomTrendLine.Calculate   
                If x Is Nothing Or x.Length = 0 Or y Is Nothing Or y.Length = 0 Then 
                  _x = Nothing   
                  _y = Nothing  
                  Return    
                End If 
       
                ' find min and max    
                Dim xmin As Double = x(0), xmax = x(0)     
                Dim ymin As Double = y(0), ymax = y(0)   
                Dim i As Integer    
                For i = 1 To x.Length - 1   
                  If x(i) < xmin Then 
                    xmin = x(i)  
                  ElseIf x(i) > xmax Then
                    xmax = x(i)  
                  End If  
                  If y(i) < ymin Then
                    ymin = y(i)  
                  ElseIf y(i) > ymax Then
                    ymax = y(i)  
                  End If   
                Next
         
                ' rectangle around data points     
                _x = New Double(4) {}    
                _y = New Double(4) {}    
                _x(0) = xmin    
                _y(0) = ymin    
                _x(4) = _x(0)   
                _y(4) = _y(0)   
                _x(2) = xmax   
                _y(2) = ymax   
                _x(1) = _x(0)   
                _y(1) = _y(2)  
                _x(3) = _x(2)   
                _y(3) = _y(0)  
        End Sub
    
          
      Public Function GetXValues() As Double() _    Implements C1.Win.C1Chart.ICustomTrendLine.GetXValues      
        Return _x    
      End Function
          
      Public Function GetYValues() As Double() _    Implements C1.Win.C1Chart.ICustomTrendLine.GetYValues     
        Return _y   
      End Function
            
      ' don't use it just return something     
      Public Function GetY(ByVal x As Double) As Double _   Implements C1.Win.C1Chart.ICustomTrendLine.GetY    
        Return 0      
      End Function
          
      Public ReadOnly Property Text() As String _    Implements C1.Win.C1Chart.ICustomTrendLine.Text      
        Get     
          Return "Custom trend"     
        End Get      
      
    End Property       
    End Class
    

    To write code in C#

    C#
    Copy Code
     
    private void button1_Click(object sender, System.EventArgs e)     
    {    
       // create trend line      
      C1.Win.C1Chart.TrendLine tl = c1Chart1.ChartGroups[0].ChartData.TrendsList.AddNewTrendLine();     
       // setup line properties      
      tl.LineStyle.Color = Color.DarkRed;    
      tl.LineStyle.Thickness = 3;   
      tl.LineStyle.Pattern = C1.Win.C1Chart.LinePatternEnum.Dash;    
       // set custom trend line     
      tl.CustomTrendLine = new CustomTrendLine();      
    }
            
    public class CustomTrendLine : C1.Win.C1Chart.ICustomTrendLine      
    {    
      private double[] _x;   
      private double[] _y;     
      public void Calculate( C1.Win.C1Chart.TrendLine tl, double[] x, double [] y)
         
      {  
        if( x==null || x.Length==0 || y==null || y.Length==0)    
        {  
          _x = null; _y = null;  
          return; 
        }   
         // find min and max    
        double xmin = x[0], xmax = x[0];
        double ymin = y[0], ymax = y[0];   
        for( int i=1; i<x.Length; i++)   
        {
          if( x[i] < xmin) 
            xmin = x[i];
          else if( x[i] > xmax)
            xmax = x[i]; 
          if( y[i] < ymin)
            ymin = y[i];
          else if( y[i] > ymax)
            ymax = y[i];   
        }
     
         // rectangle around data points  
        _x = new double[5];
        _y = new double[5]; 
        _x[0] = xmin;  _y[0] = ymin; 
        _x[4] = _x[0]; _y[4] = _y[0];
        _x[2] = xmax;  _y[2] = ymax;  
        _x[1] = _x[0]; _y[1] = _y[2];   
        _x[3] = _x[2]; _y[3] = _y[0];    
      }
          
      public double[] GetXValues() { return _x;}  
      public double[] GetYValues() { return _y;}    
       // don't use it just return something   
      public double GetY( double x) { return 0;}    
      public string Text { get{ return "Custom trend";}}    
    }
    

    This topic illustrates the following:

    A custom red dashed trend line is created around the data points.

    See Also