Ejemplo n.º 1
0
        void MeasurePan(object sender, RoutedEventArgs e)
        {
            string result = string.Empty;

            Iterate("Pan", new Action <int>(count =>
            {
                Stopwatch resampled    = new Stopwatch();
                Stopwatch nonResampled = new Stopwatch();
                ClearChart();
                LoadDataEx(count, true);
                XYDiagram2D xyd2d        = Chart.Diagram as XYDiagram2D;
                xyd2d.EnableAxisXZooming = true;
                xyd2d.EnableAxisYZooming = true;
                xyd2d.ZoomIn(null);
                resampled.Start();
                PerofrmScroll(xyd2d);
                resampled.Stop();
                ClearChart();
                LoadDataEx(count, false);
                xyd2d = Chart.Diagram as XYDiagram2D;
                nonResampled.Start();
                PerofrmScroll(xyd2d);
                nonResampled.Stop();
                result += string.Format("{0}, {1}, {2}{3}", count, resampled.ElapsedMilliseconds, nonResampled.ElapsedMilliseconds, Environment.NewLine);
            }));
            File.WriteAllText("result_scroll.txt", result);
        }
Ejemplo n.º 2
0
        protected AxisY2D FindCompatibleAxis(XYDiagram2D diagram,
                                             LineSeries2D series)
        {
            double minSeriesValue = GetSeriesMinValue(series);
            double maxSeriesValue = GetSeriesMaxValue(series);

            // check primary axis
            bool primaryAxisFits = false;

            primaryAxisFits = WhetherRangesAreCompatible(
                (double)diagram.AxisY.ActualRange.ActualMinValue,
                (double)diagram.AxisY.ActualRange.ActualMaxValue,
                minSeriesValue,
                maxSeriesValue);
            if (primaryAxisFits)
            {
                return(diagram.AxisY);
            }

            // Check all availabe secondary axes
            foreach (SecondaryAxisY2D axs in diagram.SecondaryAxesY)
            {
                double axsMin = (double)axs.ActualRange.MinValue;
                double axsMax = (double)axs.ActualRange.MaxValue;
                if (WhetherRangesAreCompatible(axsMin, axsMax,
                                               minSeriesValue, maxSeriesValue))
                {
                    return(axs);
                }
            }

            // return null is no compatible axis found.
            return(null);
        }
Ejemplo n.º 3
0
        public DoubleDoubleMouseCrosshairCursorProvider(ChartControl chart,
                                                        XYDiagram2D diagram,
                                                        LineSeries2D series,
                                                        Canvas crosshairCursorCanvas,
                                                        ValueItem valueX,
                                                        ValueItem valueY,
                                                        Border verticalLine,
                                                        Border horizontalLine,
                                                        AxisX2D axisX,
                                                        AxisY2D axisY)
            : base(diagram, axisX, axisY, verticalLine, horizontalLine, valueX, valueY)
        {
            this.chart   = chart;
            this.diagram = diagram;
            this.series  = series;
            this.crosshairCursorCanvas = crosshairCursorCanvas;
            this.valueX         = valueX;
            this.valueY         = valueY;
            this.verticalLine   = verticalLine;
            this.horizontalLine = horizontalLine;
            this.axisX          = axisX;
            this.axisY          = axisY;

            chart.MouseMove    += ChartMouseMove;
            valueX.SizeChanged += ValueXSizeChanged;
            valueY.SizeChanged += ValueYSizeChanged;
        }
Ejemplo n.º 4
0
        void cbChartDateMeasureUnit_SelectedIndexChanged(object sender, RoutedEventArgs e)
        {
            XYDiagram2D         diagram = (XYDiagram2D)chartControl.Diagram;
            DateTimeMeasureUnit unit    = (DateTimeMeasureUnit)Enum.Parse(typeof(DateTimeMeasureUnit), cbChartDateMeasureUnit.SelectedItem.ToString());

            diagram.AxisX.DateTimeScaleOptions = new ManualDateTimeScaleOptions()
            {
                MeasureUnit = unit, GridAlignment = (DateTimeGridAlignment)unit, AutoGrid = false
            };
            switch (unit)
            {
            case DateTimeMeasureUnit.Year:
                diagram.AxisX.Label.TextPattern = "{A:yyyy}";
                break;

            case DateTimeMeasureUnit.Quarter:
                diagram.AxisX.Label.TextPattern = "{A:q}";
                break;

            case DateTimeMeasureUnit.Month:
                diagram.AxisX.Label.TextPattern = "{A:y}";
                break;

            default:
                break;
            }
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Create a chart.
            ChartControl chart = new ChartControl();

            // Create a diagram.
            XYDiagram2D diagram = new XYDiagram2D();

            chart.Diagram = diagram;

            // Create a bar series.
            BarSideBySideSeries2D series = new BarSideBySideSeries2D();

            diagram.Series.Add(series);

            // Add points to the series.
            series.Points.Add(new SeriesPoint("A", 1));
            series.Points.Add(new SeriesPoint("B", 3));
            series.Points.Add(new SeriesPoint("C", 5));
            series.Points.Add(new SeriesPoint("D", 2));
            series.Points.Add(new SeriesPoint("E", 7));

            // Add the chart to the window.
            this.Content = chart;
        }
Ejemplo n.º 6
0
        // Creates a new form that is invoked on the card click and
        // shows the chart displaying client data.
        void DisplayDetailedChart(string title, DataTable dataSource)
        {
            DetailedChart detailWindow = new DetailedChart();

            detailWindow.Title = title;

            ChartControl chart   = detailWindow.detailedChartControl;
            XYDiagram2D  diagram = new XYDiagram2D();

            chart.Diagram = diagram;
            SplineAreaSeries2D series1 = new SplineAreaSeries2D();

            series1.DisplayName = "Actual";
            SplineAreaSeries2D series2 = new SplineAreaSeries2D();

            series2.DisplayName = "Target";
            diagram.Series.AddRange(new Series[] { series1, series2 });

            foreach (Series series in diagram.Series)
            {
                series.DataSource     = dataSource; series.ArgumentDataMember = "Argument";
                series.ValueScaleType = ScaleType.Numerical;
            }

            series1.ValueDataMember = "Actual";
            series2.ValueDataMember = "Target";

            detailWindow.ShowDialog();
        }
        private void OnColorChanged(object sender, EventArgs eventArgs)
        {
            ParameterDisplaySettingsViewModel cbvm =
                sender as ParameterDisplaySettingsViewModel;

            if (cbvm == null)
            {
                throw new ArgumentException("Wrong sender!");
            }
            PsaParameterDataViewModel vm = cbvm.ParamData as PsaParameterDataViewModel;

            if (graph.IsDisplayed(vm))
            {
                LineSeries2D series = graph.FindSeries(vm) as LineSeries2D;
                vm.Color     = new SolidColorBrush(cbvm.StrokeColor);
                series.Brush = new SolidColorBrush(cbvm.StrokeColor);
                SecondaryAxisY2D secAxs = XYDiagram2D.GetSeriesAxisY(series);
                if (secAxs != null)
                {
                    XYDiagram2D.GetSeriesAxisY(series).Brush = new SolidColorBrush(cbvm.StrokeColor);
                }
            }
            UpdateScalesSetView();
            UpdateScalesComboboxesView();
        }
 void PerofrmScroll(XYDiagram2D xyd2d)
 {
     for (int i = 0; i < 25; i++)
     {
         xyd2d.ScrollHorizontally(10);
         DoEvents();
     }
 }
 void PerformZoom(XYDiagram2D xyd2d)
 {
     for (int i = 0; i < 5; i++)
     {
         xyd2d.ZoomIn(null);
         DoEvents();
     }
 }
        private void CheckAddPanel(StrategyDataItemInfo info)
        {
            XYDiagram2D diagram = (XYDiagram2D)Chart.Diagram;

            while (diagram.Panes.Count <= info.PanelIndex - 1)
            {
                diagram.Panes.Add(new XYDiagramPane());
            }
        }
Ejemplo n.º 11
0
        void UpdateSeries(Series series, int index)
        {
            if (series is BubbleSeries2D)
            {
                InitializeBubbleSeries(series as BubbleSeries2D);
                return;
            }
            else if (series is FinancialSeries2D)
            {
                InitializeFinancialSeries(series as FinancialSeries2D);
                XYDiagram2D diagram = chart.Diagram as XYDiagram2D;
                if (diagram != null)
                {
                    AxisY2D.SetAlwaysShowZeroLevel(diagram.ActualAxisY.ActualWholeRange, false);
                }
                return;
            }
            if (series is PieSeries2D)
            {
                PieSeries2D pieSeries = series as PieSeries2D;
                if (!(pieSeries is NestedDonutSeries2D))
                {
                    pieSeries.HoleRadiusPercent = 0;
                }
                InitializePieSeries(pieSeries);
                return;
            }
            if (series is FunnelSeries2D)
            {
                InitializeFunnelSeries(series as FunnelSeries2D);
                return;
            }
            if (series is RangeBarSeries2D)
            {
                RangeBarSeries2D rangeBar = series as RangeBarSeries2D;
                InitializeRangeBarSeries(series as RangeBarSeries2D, index + 1);
                series.LabelsVisibility = false;
                if (rangeBar is RangeBarOverlappedSeries2D && index == 1)
                {
                    rangeBar.BarWidth = 0.2;
                }
                return;
            }
            if (series is RangeAreaSeries2D)
            {
                InitializeRangeAreaSeries(series as RangeAreaSeries2D);
                return;
            }
            if (series is CircularSeries2D)
            {
                InitializePolarSeries(series as CircularSeries2D);
                return;
            }

            InitializeSeries(series, index + 1);
        }
Ejemplo n.º 12
0
        void FillCustomAxisLabels()
        {
            XYDiagram2D diagram = (XYDiagram2D)chart.Diagram;

            for (int i = 0; i < 1000; i += 120)
            {
                TimeSpan duration = TimeSpan.FromMinutes(i);
                diagram.AxisY.CustomLabels.Add(new CustomAxisLabel(i, String.Format("{0} hours", duration.Hours.ToString())));
            }
        }
Ejemplo n.º 13
0
 void PerofrmScroll(XYDiagram2D xyd2d)
 {
     xyd2d.EnableAxisXScrolling = true;
     xyd2d.EnableAxisYScrolling = true;
     for (int i = 0; i < 25; i++)
     {
         xyd2d.Scroll(HorizontalScrollingDirection.Left, VerticalScrollingDirection.None);
         DoEvents();
     }
 }
Ejemplo n.º 14
0
 void PerformZoom(XYDiagram2D xyd2d)
 {
     xyd2d.EnableAxisXZooming = true;
     xyd2d.EnableAxisYZooming = true;
     for (int i = 0; i < 5; i++)
     {
         xyd2d.ZoomIn(null);
         DoEvents();
     }
 }
Ejemplo n.º 15
0
 static void PrepareXYDiagram2D(XYDiagram2D diagram)
 {
     if (diagram == null)
     {
         return;
     }
     diagram.AxisX                 = new AxisX2D();
     diagram.AxisX.Label           = new AxisLabel();
     diagram.AxisX.Label.Staggered = true;
 }
Ejemplo n.º 16
0
        private void OnChartControlMouseUp(object sender, MouseButtonEventArgs e)
        {
            XYDiagram2D xyDiagram = chartControl.Diagram as XYDiagram2D;

            if (xyDiagram == null)
            {
                return;
            }

            xyDiagram.ShowCrosshair(e.GetPosition(chartControl));
        }
        private void ProcessSelectedScale(LineSeries2D series, ChartScale scale)
        {
            var axs = scale.Axis as SecondaryAxisY2D;

            if (axs == null)
            {
                throw new ArgumentException();
            }
            UpdateAxisRangeToNewSeries(axs, series);
            XYDiagram2D.SetSeriesAxisY(series, axs);
        }
        private void chartControl1_BoundDataChanged(object sender, RoutedEventArgs e)
        {
            XYDiagram2D diagram = ((ChartControl)sender).Diagram as XYDiagram2D;
            Axis2D      axisY   = diagram.ActualAxisY;

            axisY.VisualRange = new Range();
            double minValue = diagram.Series.Select(s => s.Points.Min(p => p.Value)).Min() * 1.1;
            double maxValue = diagram.Series.Select(s => s.Points.Max(p => p.Value)).Max() * 1.1;

            axisY.VisualRange.SetMinMaxValues(minValue, maxValue);
        }
 static void PrepareXYDiagram2D(XYDiagram2D diagram)
 {
     if (diagram == null)
     {
         return;
     }
     diagram.AxisX = new AxisX2D {
         Label = new AxisLabel {
             Staggered = true
         }
     };
 }
        public void AddGraph(IPsaParameterDataViewModel vm, Color strokeColor)
        {
            current.Add(vm, strokeColor);
            LineSeries2D series = new LineSeries2D();

            series.DataContext       = vm;
            series.Brush             = new SolidColorBrush(strokeColor);
            series.ValueScaleType    = ScaleType.Numerical;
            series.ArgumentScaleType = ScaleType.Numerical;
            series.MarkerVisible     = false;
            series.ShowInLegend      = false;
            series.Label             = new SeriesLabel();
            series.LabelsVisibility  = false;

            for (int i = 0; i < vm.Values.Count; i++)
            {
                SeriesPoint pt;
                if (!vm.HasTimestamps)
                {
                    pt = new SeriesPoint(i, vm.Values[i]);
                }
                else
                {
                    pt = new SeriesPoint(vm.Model.Timestamps[i], vm.Values[i]);
                }
                series.Points.Add(pt);
            }
            if (graphDiagram.Series.Count > 0)
            {
                AxisY2D compatibleAxis =
                    FindCompatibleAxis(graphDiagram, series);

                if (compatibleAxis == null)
                {
                    SecondaryAxisY2D newAxis = GenerateNewAxis(series);
                    newAxis.Brush = new SolidColorBrush(strokeColor);
                    graphDiagram.SecondaryAxesY.Add(newAxis);
                    XYDiagram2D.SetSeriesAxisY(series, newAxis);
                }
                else
                {
                    if (compatibleAxis is SecondaryAxisY2D)
                    {
                        UpdateAxisByNewSeries(
                            (SecondaryAxisY2D)compatibleAxis, series);
                        XYDiagram2D.SetSeriesAxisY(series,
                                                   (SecondaryAxisY2D)compatibleAxis);
                    }
                }
            }
            graphDiagram.Series.Add(series);
        }
 public DoubleDoubleCrosshairCursorProvider(XYDiagram2D diagram,
                                            AxisX2D axisX,
                                            AxisY2D axisY,
                                            Border verticalLine,
                                            Border horizontalLine,
                                            ValueItem valueX,
                                            ValueItem valueY)
 {
     this.diagram        = diagram;
     this.axisX          = axisX;
     this.axisY          = axisY;
     this.verticalLine   = verticalLine;
     this.horizontalLine = horizontalLine;
     this.valueX         = valueX;
     this.valueY         = valueY;
 }
Ejemplo n.º 22
0
        void bindData(bool allowResample)
        {
            Series series = new Series();

            chartControl1.Series.Add(series);
            series.View          = new LineSeriesView();
            series.AllowResample = allowResample;
            series.BindToData(chartSource, "Argument", "Value");
            XYDiagram2D d2d = chartControl1.Diagram as XYDiagram2D;

            if (d2d != null)
            {
                d2d.ZoomingOptions.AxisXMaxZoomPercent = 100000000;
                d2d.ZoomingOptions.AxisYMaxZoomPercent = 100000000;
            }
        }
Ejemplo n.º 23
0
        void chart_BoundDataChanged(object sender, RoutedEventArgs e)
        {
            ConstantLines.Clear();//清理上次显示的线条


            XYDiagram2D diagram = (XYDiagram2D)cc_CaseStatistics.Diagram;

            if (diagram.Series[0].Points.Count == 0)
            {
                return;
            }
            double minPrice     = Double.MaxValue;
            double maxPrice     = 0;
            double averagePrice = 0;

            foreach (SeriesPoint point in diagram.Series[0].Points)
            {
                double price = point.Value;
                if (price < minPrice)
                {
                    minPrice = price;
                }
                if (price > maxPrice)
                {
                    maxPrice = price;
                }
                averagePrice += price;
            }
            averagePrice /= diagram.Series[0].Points.Count;
            ConstantLine minConstantLine = new ConstantLine(minPrice, "最少");

            minConstantLine.Brush            = new SolidColorBrush(Colors.Green);
            minConstantLine.Title.Foreground = new SolidColorBrush(Colors.Green);
            ConstantLine maxConstantLine = new ConstantLine(maxPrice, "最多");

            maxConstantLine.Brush            = new SolidColorBrush(Colors.Red);
            maxConstantLine.Title.Foreground = new SolidColorBrush(Colors.Red);
            ConstantLine averageConstantLine = new ConstantLine(averagePrice, "平均");

            averageConstantLine.Brush            = new SolidColorBrush(Color.FromArgb(0xFF, 0x9A, 0xCD, 0x32));
            averageConstantLine.Title.Foreground = new SolidColorBrush(Color.FromArgb(0xFF, 0x9A, 0xCD, 0x32));
            ConstantLines.AddRange(new ConstantLine[] { minConstantLine, maxConstantLine, averageConstantLine });
            foreach (ConstantLine constantLine in ConstantLines)
            {
                constantLine.Title.Alignment = ConstantLineTitleAlignment.Far;
            }
        }
Ejemplo n.º 24
0
        Type InitDiagram()
        {
            XYDiagram2D xyDiagram = new XYDiagram2D();

            xyDiagram.SeriesDataMember           = "Series";
            xyDiagram.AxisX                      = new AxisX2D();
            xyDiagram.AxisX.DateTimeScaleOptions = new ManualDateTimeScaleOptions()
            {
                MeasureUnit = DateTimeMeasureUnit.Year, GridAlignment = DateTimeGridAlignment.Year, AutoGrid = false
            };
            xyDiagram.AxisX.WholeRange = new DevExpress.Xpf.Charts.Range();
            xyDiagram.AxisY            = new AxisY2D();
            xyDiagram.AxisY.WholeRange = new DevExpress.Xpf.Charts.Range();
            xyDiagram.AxisX.Label      = new AxisLabel();
            chartControl.Diagram       = xyDiagram;
            return(chartControl.Diagram.GetType());
        }
Ejemplo n.º 25
0
 private void Clear()
 {
     diagram                             = new XYDiagram2D();
     diagram.AxisX                       = new AxisX2D();
     diagram.AxisX.Label                 = new AxisLabel();
     diagram.AxisX.Label.Staggered       = false;
     diagram.AxisX.Name                  = "axisX";
     diagram.AxisX.TickmarksMinorVisible = false;
     diagram.AxisX.GridLinesMinorVisible = true;
     diagram.AxisX.GridLinesVisible      = true;
     diagram.AxisY                       = new AxisY2D();
     diagram.AxisY.Name                  = "axisY";
     diagram.AxisY.GridLinesMinorVisible = true;
     diagram.AxisY.GridLinesVisible      = true;
     chart.Diagram                       = diagram;
     ResetSliders();
 }
 public DoubleDoubleMovingCrosshairCursorProvider(XYDiagram2D diagram,
                                                  AxisX2D axisX,
                                                  AxisY2D axisY,
                                                  Canvas crosshairCursorCanvas,
                                                  Series series,
                                                  Border verticalLine,
                                                  Border horizontalLine,
                                                  ValueItem valueX,
                                                  ValueItem valueY)
     : base(diagram, axisX, axisY, verticalLine, horizontalLine, valueX, valueY)
 {
     this.crosshairCursorCanvas = crosshairCursorCanvas;
     this.diagram        = diagram;
     this.series         = series;
     this.verticalLine   = verticalLine;
     this.horizontalLine = horizontalLine;
 }
        public void RemoveGraph(IPsaParameterDataViewModel vm)
        {
            current.Remove(vm);
            Series toDelete = null;

            foreach (Series s in graphDiagram.Series)
            {
                IPsaParameterDataViewModel param =
                    s.DataContext as IPsaParameterDataViewModel;
                if (param != null)
                {
                    if (param.Type == vm.Type)
                    {
                        toDelete = s;
                        break;
                    }
                }
            }
            // determine axes to delete
            AxisY2D axsToDelete = XYDiagram2D.
                                  GetSeriesAxisY((XYSeries)toDelete);
            bool axsUsedSomewhereElse = false;

            foreach (XYSeries s in graphDiagram.Series)
            {
                if (s != null && s == toDelete)
                {
                    continue;
                }
                AxisY2D axs = XYDiagram2D.GetSeriesAxisY(s);
                if (axs != null && axs == axsToDelete)
                {
                    axsUsedSomewhereElse = true;
                }
            }
            graphDiagram.Series.Remove(toDelete);
            SecondaryAxisY2D axsToDeleteCast =
                axsToDelete as SecondaryAxisY2D;

            if (!axsUsedSomewhereElse && axsToDeleteCast != null)
            {
                graphDiagram.SecondaryAxesY.
                Remove(axsToDeleteCast);
            }
        }
Ejemplo n.º 28
0
        void GetDailyChartData()
        {
            XYDiagram2D           diagram2D = new XYDiagram2D();
            BarSideBySideSeries2D barIn     = new BarSideBySideSeries2D();
            BarSideBySideSeries2D barOut    = new BarSideBySideSeries2D();

            //List<DataTable> dataTables = new List<DataTable>();
            DateTime recent = DateTime.Now;

            for (int i = 0; i < 5; i++)
            {
                DataTable table = ReportDAO.Instance.GetDailyReport(recent);
                recent = recent.AddDays(-1);
                foreach (DataRow row in table.Rows)
                {
                }
            }
        }
 void CreateSeries(XYSeries series1, XYSeries series2)
 {
     series1.AnimationAutoStartMode = AnimationAutoStartMode.SetStartState;
     series2.AnimationAutoStartMode = AnimationAutoStartMode.SetStartState;
     chart.Diagram.Series.Clear();
     chart.Diagram.Series.Add(series1);
     PrepareSeries1(series1);
     chart.Diagram.Series.Add(series2);
     PrepareSeries2(series2);
     if (lbSeries2AxisX.SelectedIndex == 1)
     {
         XYDiagram2D.SetSeriesAxisX(SecondSeries, SecondaryAxisX);
     }
     if (lbSeries2AxisY.SelectedIndex == 1)
     {
         XYDiagram2D.SetSeriesAxisY(SecondSeries, SecondaryAxisY);
     }
 }
 void lbSeries2AxisY_SelectedIndexChanged(object sender, RoutedEventArgs e)
 {
     if (chart != null && SecondSeries != null)
     {
         if (lbSeries2AxisY.SelectedIndex == 0)
         {
             XYDiagram2D.SetSeriesAxisY(SecondSeries, null);
             SecondaryAxisY.Visible = false;
             AxisY.Title.Content    = FirstSeries.DisplayName + ", " + SecondSeries.DisplayName + PrimaryPostfixY;
         }
         else
         {
             XYDiagram2D.SetSeriesAxisY(SecondSeries, SecondaryAxisY);
             SecondaryAxisY.Visible = true;
             AxisY.Title.Content    = FirstSeries.DisplayName + PrimaryPostfixY;
         }
     }
 }
Ejemplo n.º 31
0
        private void InitialChart()
        {
            chart = defectMap;

            // 關閉十字瞄準游標
            chart.CrosshairEnabled = false;

            // 綁定事件
            //chart.CustomDrawSeriesPoint += chart_CustomDrawSeriesPoint;
            chart.MouseMove += chart_MouseMove;
            chart.MouseDoubleClick += chart_MouseDoubleClick;

            // 定義圖表類型
            XYDiagram2D diagram = new XYDiagram2D();

            // 設定坐標軸最小/最大值、格線類型及刻度
            diagram.AxisX = new AxisX2D();
            diagram.AxisX.Range = new AxisRange();
            diagram.AxisX.Range.MinValue = 0;
            //diagram.AxisX.Range.MaxValue = 60;
            diagram.AxisX.GridLinesLineStyle = new LineStyle();
            diagram.AxisX.GridLinesLineStyle.DashStyle = DashStyles.Dash;
            diagram.AxisX.GridSpacing = 1;
            diagram.AxisX.TickmarksMinorVisible = false;

            diagram.AxisY = new AxisY2D();
            diagram.AxisY.Range = new AxisRange();
            diagram.AxisY.Range.MinValue = 0;
            //diagram.AxisY.Range.MaxValue = 60;
            diagram.AxisY.GridLinesLineStyle = new LineStyle();
            diagram.AxisY.GridLinesLineStyle.DashStyle = DashStyles.Dash;
            diagram.AxisY.GridSpacing = 1;
            diagram.AxisY.TickmarksMinorVisible = false;

            chart.Diagram = diagram;
        }
Ejemplo n.º 32
0
 public static ChartControl CreatXYChart(SolidColorBrush forecolor, string ChartTitle, List<ChartDataChartCommonData> dtchart)
 {
     mausac = 0;
     ChartControl abc = new ChartControl();
     XYDiagram2D dg1 = new XYDiagram2D();
     //Tao Tile cho Chart
     Title nt = new Title();
     nt.Content = ChartTitle;
     nt.Foreground = forecolor;
     abc.Titles.Add(nt);
     //Tinh so Series
     List<string> countsr = (from p in dtchart group p by p.Series into g select g.Key).ToList();
     //Creat Diagram
     abc.Diagram = dg1;
     //Begin tao guong
     Pane pane1 = new Pane();
     pane1.MirrorHeight = 100;//Do cao guong
     dg1.DefaultPane = pane1;
     //End tao guong
     //Begin set kieu bieu do
     for (int i = 0; i < countsr.Count; i++)
     {
         BarSideBySideSeries2D dgs1 = new BarSideBySideSeries2D() { DisplayName = countsr[i].ToString() };//Neu ko co DisplayName chu thich khong hien thi
         Quasi3DBar2DModel an1 = new Quasi3DBar2DModel();
         dgs1.Model = an1;
         foreach (ChartDataChartCommonData dr in dtchart)//Tao cac point
         {
             if (dr.Series == countsr.ElementAt(i))
             {
                 //Tao Series
                 SeriesPoint sr1 = new SeriesPoint();
                 sr1.Argument = dr.Agrument;
                 sr1.Value = dr.Value;
                 sr1.Tag = mausac.ToString();
                 dgs1.Points.Add(sr1);
                 mausac++;
             }
         }
         SeriesLabel lbl1 = new SeriesLabel();
         dgs1.LabelsVisibility = true;//Hien thi Lablel cho tung vung
         lbl1.Indent = 10;
         lbl1.ConnectorThickness = 1;
         lbl1.ResolveOverlappingMode = ResolveOverlappingMode.Default;
         dgs1.Label = lbl1;
         dg1.Series.Add(dgs1);
     }
     //Tao chu thich
     abc.Legend = new Legend()
     {
         VerticalPosition = VerticalPosition.BottomOutside,
         HorizontalPosition = HorizontalPosition.Center,
         Orientation = Orientation.Horizontal
     };
     //End tao chu thich
     return abc;
 }