Example #1
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="l1">Vertical line to provide bounds for filled region</param>
 /// <param name="l2">The other Vertical line to provide bounds for filled region</param>
 public FilledRegion(HorizontalLine l1, HorizontalLine l2)
 {
     hl1_ = l1;
     hl2_ = l2;
 }
        public void PlotMockup()
        {
            string lines ="THE TEST (can your charting library handle this?) - xuzhenzhen.com.chart demonstrates it can handle real world charting requirements.";
            infoBox.Text = lines;
            // first of all, generate some mockup data.
            DataTable info = new DataTable( "Store Information" );
            info.Columns.Add( "Index", typeof(int) );
            info.Columns.Add( "IndexOffsetLeft", typeof(float) );
            info.Columns.Add( "IndexOffsetRight", typeof(float) );
            info.Columns.Add( "StoreName", typeof(string) );
            info.Columns.Add( "BarBase", typeof(float) );
            info.Columns.Add( "StoreGrowth", typeof(float) );
            info.Columns.Add( "AverageGrowth", typeof(float) );
            info.Columns.Add( "ProjectedSales", typeof(float) );

            float barBase = 185.0f;
            Random r = new Random();
            for (int i=0; i<18; ++i)
            {
                DataRow row = info.NewRow();
                row["Index"] = i;
                row["IndexOffsetLeft"] = (float)i - 0.1f;
                row["IndexOffsetRight"] = (float)i + 0.1f;
                row["StoreName"] = "Store " + (i+1).ToString();
                row["BarBase"] = barBase;
                row["StoreGrowth"] = barBase + ( (r.NextDouble() - 0.1) * 20.0f );
                row["AverageGrowth"] = barBase + ( (r.NextDouble() - 0.1) * 15.0f );
                row["ProjectedSales"] = barBase + ( r.NextDouble() * 15.0f );
                info.Rows.Add( row );
                barBase += (float)r.NextDouble() * 4.0f;
            }

            plotSurface.Clear();

            // generate the grid
            Grid grid = new Grid();
            grid.VerticalGridType = Grid.GridType.Coarse;
            grid.HorizontalGridType = Grid.GridType.None;
            grid.MajorGridPen = new Pen( Color.Black, 1.0f );
            plotSurface.Add( grid );

            // generate the trendline
            LinePlot trendline = new LinePlot();
            trendline.DataSource = info;
            trendline.AbscissaData = "Index";
            trendline.OrdinateData = "BarBase";
            trendline.Pen = new Pen( Color.Black, 3.0f );
            trendline.Label = "Trendline";
            plotSurface.Add( trendline );

            // draw store growth bars
            BarPlot storeGrowth = new BarPlot();
            storeGrowth.DataSource = info;
            storeGrowth.AbscissaData = "IndexOffsetLeft";
            storeGrowth.OrdinateDataTop = "StoreGrowth";
            storeGrowth.OrdinateDataBottom = "BarBase";
            storeGrowth.Label = "Store Growth";
            storeGrowth.FillBrush = xuzhenzhen.com.chart.RectangleBrushes.Solid.Black;
            //storeGrowth.BorderPen = new Pen( Color.Black, 2.0f );
            plotSurface.Add( storeGrowth );

            // draw average growth bars
            BarPlot averageGrowth = new BarPlot();
            averageGrowth.DataSource = info;
            averageGrowth.AbscissaData = "IndexOffsetRight";
            averageGrowth.OrdinateDataBottom = "BarBase";
            averageGrowth.OrdinateDataTop = "AverageGrowth";
            averageGrowth.Label = "Average Growth";
            averageGrowth.FillBrush = xuzhenzhen.com.chart.RectangleBrushes.Solid.Gray;
            //averageGrowth.BorderPen = new Pen( Color.Black, 2.0f );
            plotSurface.Add( averageGrowth );

            // generate the projected sales step line.
            StepPlot projected = new StepPlot();
            projected.DataSource = info;
            projected.AbscissaData = "Index";
            projected.OrdinateData = "ProjectedSales";
            projected.Pen = new Pen( Color.Orange, 3.0f );
            projected.HideVerticalSegments = true;
            projected.Center = true;
            projected.Label = "Projected Sales";
            projected.WidthScale = 0.7f;
            plotSurface.Add( projected );

            // generate the minimum target line.
            HorizontalLine minimumTargetLine = new HorizontalLine( 218, new Pen( Color.Green, 3.5f ) );
            minimumTargetLine.Label = "Minimum Target";
            minimumTargetLine.LengthScale = 0.98f;
            minimumTargetLine.ShowInLegend = true; // off by default for lines.
            plotSurface.Add( minimumTargetLine );

            // generate the preferred target line.
            HorizontalLine preferredTargetLine = new HorizontalLine( 228, new Pen( Color.Blue, 3.5f ) );
            preferredTargetLine.Label = "Preferred Target";
            preferredTargetLine.LengthScale = 0.98f;
            preferredTargetLine.ShowInLegend = true; // off by default for lines.
            plotSurface.Add( preferredTargetLine );

            // make some modifications so that chart matches requirements.
            // y axis.
            plotSurface.YAxis1.TicksIndependentOfPhysicalExtent = true;
            plotSurface.YAxis1.TickTextNextToAxis = false;
            plotSurface.YAxis1.TicksAngle = 3.0f * (float)Math.PI / 2.0f;
            ((LinearAxis)plotSurface.YAxis1).LargeTickStep = 10.0;
            ((LinearAxis)plotSurface.YAxis1).NumberOfSmallTicks = 0;

            // x axis
            plotSurface.XAxis1.TicksIndependentOfPhysicalExtent = true;
            plotSurface.XAxis1.TickTextNextToAxis = false;
            plotSurface.XAxis1.TicksAngle = (float)Math.PI / 2.0f;
            LabelAxis la = new LabelAxis( plotSurface.XAxis1 );
            for (int i=0; i<info.Rows.Count; ++i)
            {
                la.AddLabel( (string)info.Rows[i]["StoreName"], Convert.ToInt32(info.Rows[i]["Index"]) );
            }
            la.TicksLabelAngle = (float)90.0f;
            la.TicksBetweenText = true;
            plotSurface.XAxis1 = la;

            plotSurface.XAxis2 = (Axis)plotSurface.XAxis1.Clone();
            plotSurface.XAxis2.HideTickText = true;
            plotSurface.XAxis2.LargeTickSize = 0;

            Legend l = new Legend();
            l.NumberItemsVertically = 2;
            l.AttachTo( xuzhenzhen.com.chart.PlotSurface2D.XAxisPosition.Bottom, xuzhenzhen.com.chart.PlotSurface2D.YAxisPosition.Left );
            l.HorizontalEdgePlacement = xuzhenzhen.com.chart.Legend.Placement.Outside;
            l.VerticalEdgePlacement = xuzhenzhen.com.chart.Legend.Placement.Inside;
            l.XOffset = 5;
            l.YOffset = 50;
            l.BorderStyle = xuzhenzhen.com.chart.LegendBase.BorderType.Line;

            plotSurface.Legend = l;

            plotSurface.Title =
                "Sales Growth Compared to\n" +
                "Average Sales Growth by Store Size - Rank Order Low to High";
            plotSurface.XAxis1.LabelOffset = 0;
            plotSurface.YAxis1.LabelOffset = 0;
            plotSurface.Refresh();
        }
        public void InitDataToChart()
        {
            //清空
            chart1.Clear();
            chart2.Clear();
            chart3.Clear();
            //垂直线
            vline = new VerticalLine(0, Color.Blue);
            //图例
            legend = new Legend();
            legend.AttachTo(PlotSurface2D.XAxisPosition.Top, PlotSurface2D.YAxisPosition.Left);
            legend.VerticalEdgePlacement = Legend.Placement.Inside;
            legend.HorizontalEdgePlacement = Legend.Placement.Outside;
            legend.YOffset = -5;
            legend.BorderStyle = LegendBase.BorderType.Line;
            legend.NumberItemsHorizontally = 4;
            //网格
            grid = new Grid();
            grid.HorizontalGridType = Grid.GridType.Fine;
            grid.VerticalGridType = Grid.GridType.Fine;
            grid.MajorGridPen.Color = Color.Silver;
            grid.MinorGridPen.Color = Color.Silver;
            /////区域着色////////
            fill = new FilledRegion(new VerticalLine(-1), new VerticalLine(8));
            fill.Brush = new SolidBrush(Color.FromArgb(250, 218, 169));
            /////////////////////////////////////////////
            //直线图
            sysPlot = new LinePlot();
            sysPlot.OrdinateData = sysList;
            sysPlot.AbscissaData = timeList;
            sysPlot.Color = Color.RoyalBlue;
            sysPlot.Pen.Width = 2.0f;
            sysPlot.Label = "SYS";

            diaPlot = new LinePlot();
            diaPlot.OrdinateData = diaList;
            diaPlot.AbscissaData = timeList;
            diaPlot.Color = Color.OrangeRed;
            diaPlot.Pen.Width = 2.0f;
            diaPlot.Label = "DIA";

            mapPlot = new LinePlot();
            mapPlot.OrdinateData = mapList;
            mapPlot.AbscissaData = timeList;
            mapPlot.Color = Color.Chartreuse;
            mapPlot.Pen.Width = 2.0f;
            mapPlot.Label = "MAP";

            hrPlot = new LinePlot();
            hrPlot.OrdinateData = hrList;
            hrPlot.AbscissaData = timeList;
            hrPlot.Color = Color.DarkSlateBlue;
            hrPlot.Pen.Width = 2.0f;

            sys_hrPlot = new LinePlot();
            sys_hrPlot.OrdinateData = sys_hrList;
            sys_hrPlot.AbscissaData = timeList;
            sys_hrPlot.Color = Color.Green;
            sys_hrPlot.Pen.Width = 2.0f;

            //水平线
            hline1 = new HorizontalLine(70, Color.Gray);
            hline2 = new HorizontalLine(90, Color.Gray);
            hline3 = new HorizontalLine(120, Color.Gray);
            hline4 = new HorizontalLine(140, Color.Gray);

            ///////////////////////
            chart1.Add(fill);
            chart1.Add(grid);
            chart1.Add(sysPlot);
            chart1.Add(diaPlot);
            chart1.Add(mapPlot);
            chart1.Add(hline1);
            chart1.Add(hline2);
            chart1.Add(hline3);
            chart1.Add(hline4);
            chart1.Add(vline);
            chart1.XAxis1.HideTickText = true;
            chart1.YAxis1.Label = "血压:mmHg";
            chart1.YAxis1.LabelOffsetAbsolute = true;
            chart1.YAxis1.WorldMin = chart1.YAxis1.WorldMin - 20;
            chart1.YAxis1.WorldMax = chart1.YAxis1.WorldMax + 20;
            chart1.Padding = 5;
            chart1.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.HorizontalDrag());
            chart1.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.VerticalDrag());
            chart1.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.VerticalGuideline());
            chart1.AddAxesConstraint(new AxesConstraint.AxisPosition(PlotSurface2D.YAxisPosition.Left, 60));
            chart1.InteractionOccured += new xuzhenzhen.com.chart.Windows.PlotSurface2D.InteractionHandler(chart1_InteractionOccured);
            chart1.PlotBackColor = Color.White;
            chart1.BackColor = System.Drawing.SystemColors.Control;
            chart1.XAxis1.Color = Color.Black;
            chart1.YAxis1.Color = Color.Black;
            chart1.Legend = legend;
            chart1.LegendZOrder = 1;
            chart1.Refresh();
            ///////////////////////////
            chart2.Add(fill);
            chart2.Add(grid);
            chart2.Add(hrPlot);
            chart2.Add(vline);
            chart2.XAxis1.HideTickText = true;
            chart2.YAxis1.Label = "心率:BPM";
            chart2.YAxis1.LabelOffsetAbsolute = true;
            chart2.Padding = 5;
            chart2.AddAxesConstraint(new AxesConstraint.AxisPosition(PlotSurface2D.YAxisPosition.Left, 60));
            chart2.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.HorizontalDrag());
            chart2.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.VerticalDrag());
            chart2.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.VerticalGuideline());
            chart2.InteractionOccured += new xuzhenzhen.com.chart.Windows.PlotSurface2D.InteractionHandler(chart2_InteractionOccured);
            chart2.PlotBackColor = Color.White;
            chart2.BackColor = System.Drawing.SystemColors.Control;
            chart2.XAxis1.Color = Color.Black;
            chart2.YAxis1.Color = Color.Black;
            chart2.Refresh();
            ///////////////////////////
            chart3.Add(fill);
            chart3.Add(grid);
            chart3.Add(sys_hrPlot);
            chart3.Add(vline);
            LabelAxis axis = new LabelAxis(chart3.XAxis1);
            int tick = 1;
            if (chart2.XAxis1.WorldMax - chart2.XAxis1.WorldMin > 30)
                tick = 2;
            for (int i = (int)chart2.XAxis1.WorldMin; i <= chart2.XAxis1.WorldMax; i+=tick)
            {
                int j = i % 24;
                if (j < 0) j += 24;
                axis.AddLabel(Convert.ToString(j), i);
            }
            chart3.XAxis1 = axis;
            chart3.XAxis1.Label = "Time:Hour";
            chart3.YAxis1.Label = "SYS*PR/100";
            chart3.YAxis1.LabelOffsetAbsolute = true;
            chart3.Padding = 5;
            chart3.AddAxesConstraint(new AxesConstraint.AxisPosition(PlotSurface2D.YAxisPosition.Left, 60));
            chart3.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.HorizontalDrag());
            chart3.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.VerticalDrag());
            chart3.AddInteraction(new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.VerticalGuideline());
            chart3.InteractionOccured += new xuzhenzhen.com.chart.Windows.PlotSurface2D.InteractionHandler(chart3_InteractionOccured);
            chart3.PlotBackColor = Color.White;
            chart3.BackColor = System.Drawing.SystemColors.Control;
            chart3.XAxis1.Color = Color.Black;
            chart3.YAxis1.Color = Color.Black;
            chart3.Refresh();
            SetStatusNow();
        }
        public void PlotCandleSimple()
        {
            string lines = "Simple CandlePlot example. Demonstrates -  * Setting candle plot datapoints using arrays.";
            infoBox.Text = lines;

            plotSurface.Clear();

            FilledRegion fr = new FilledRegion(
                new VerticalLine(1.2),
                new VerticalLine(2.4));
            fr.Brush = new SolidBrush(Color.BlanchedAlmond);
            plotSurface.Add(fr);

            // note that arrays can be of any type you like.
            int[] opens =  { 1, 2, 1, 2, 1, 3 };
            double[] closes = { 2, 2, 2, 1, 2, 1 };
            float[] lows =   { 0, 1, 1, 1, 0, 0 };
            System.Int64[] highs =  { 3, 2, 3, 3, 3, 4 };
            int[] times =  { 0, 1, 2, 3, 4, 5 };

            CandlePlot cp = new CandlePlot();
            cp.CloseData = closes;
            cp.OpenData = opens;
            cp.LowData = lows;
            cp.HighData = highs;
            cp.AbscissaData = times;
            plotSurface.Add(cp);

            HorizontalLine line = new HorizontalLine( 1.2 );
            line.LengthScale = 0.89f;
            plotSurface.Add( line, -10 );

            VerticalLine line2 = new VerticalLine( 1.2 );
            line2.LengthScale = 0.89f;
            plotSurface.Add( line2 );

            plotSurface.AddInteraction( new xuzhenzhen.com.chart.Windows.PlotSurface2D.Interactions.MouseWheelZoom() );

            plotSurface.Title = "Line in the Title Number 1\nFollowed by another title line\n and another";
            plotSurface.XAxis1.LabelOffset = 0;
            plotSurface.YAxis1.LabelOffset = 0;
            plotSurface.Refresh();
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="l1">Vertical line to provide bounds for filled region</param>
 /// <param name="l2">The other Vertical line to provide bounds for filled region</param>
 public FilledRegion(HorizontalLine l1, HorizontalLine l2)
 {
     hl1_ = l1;
     hl2_ = l2;
 }