public static void AddLineChart(Group elements, float x, float y)
        {
            AddCaptionAndRectangle(elements, "Line Chart", x, y, 225, 225);

            // Create a chart
            Chart chart = new Chart(x + 10, y + 25, 200, 200, Font.Helvetica, 10, RgbColor.Black);

            // Create a plot area
            PlotArea plotArea = chart.PrimaryPlotArea;

            // Create header title and add it to the chart
            Title title1 = new Title("Website Visitors");

            chart.HeaderTitles.Add(title1);

            // Create a indexed line series and add values to it
            IndexedLineSeries lineSeries1 = new IndexedLineSeries("Website A");

            lineSeries1.Values.Add(new float[] { 5, 7, 9, 6 });
            IndexedLineSeries lineSeries2 = new IndexedLineSeries("Website B");

            lineSeries2.Values.Add(new float[] { 4, 2, 5, 8 });
            IndexedLineSeries lineSeries3 = new IndexedLineSeries("Website C");

            lineSeries3.Values.Add(new float[] { 2, 4, 6, 9 });

            // Add indexed line series to the plot area
            plotArea.Series.Add(lineSeries1);
            plotArea.Series.Add(lineSeries2);
            plotArea.Series.Add(lineSeries3);

            // Create a title and add it to the yaxis
            Title lTitle = new Title("Visitors (in millions)");

            lineSeries1.YAxis.Titles.Add(lTitle);

            //Adding AxisLabels to the XAxis
            lineSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q1", 0));
            lineSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q2", 1));
            lineSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q3", 2));
            lineSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q4", 3));
            chart.Legends[0].Visible = false;
            elements.Add(chart);
        }
        public static void AddMultiTypeSeriesChart(Group elements, float x, float y)
        {
            AddCaptionAndRectangle(elements, "Plot Area With Different Kinds of Series and Multiple Axis ", x, y, 650, 410);

            // Create a chart
            Chart chart = new Chart(x + 25, y + 37, 600, 350);

            // Create a Auto gradient and set it to chart back ground color
            AutoGradient autogradient = new AutoGradient(90f, CmykColor.LightYellow, CmykColor.LightSkyBlue);

            chart.BackgroundColor = autogradient;

            // Create a plot area
            PlotArea plotArea = chart.PrimaryPlotArea;

            // Create header titles and add it to the chart
            Title title1 = new Title("Company Sales and Website Visitors ");

            title1.Align = Align.Left;
            chart.HeaderTitles.Add(title1);

            // Create a indexed line series and add values to it
            IndexedLineSeries lineSeries1 = new IndexedLineSeries("Website A Visitors");

            lineSeries1.Values.Add(new float[] { 1.5f, 8, 7.5f, 5.5f });
            lineSeries1.Color = RgbColor.DarkBlue;
            IndexedLineSeries lineSeries2 = new IndexedLineSeries("Website B Visitors");

            lineSeries2.Color = RgbColor.LimeGreen;
            lineSeries2.Values.Add(new float[] { 4, 3, 7, 7.5f });

            // Create markers and add it to the series
            Marker marker1 = Marker.GetTriangle(7);

            lineSeries1.Marker = marker1;
            Marker marker2 = Marker.GetCircle(7);

            lineSeries2.Marker = marker2;

            // Add indexed line series to the plot area
            plotArea.Series.Add(lineSeries1);
            plotArea.Series.Add(lineSeries2);

            // Create a NumericYAxis and a title to it
            NumericYAxis numericyaxis1 = new NumericYAxis();

            numericyaxis1.AnchorType = YAxisAnchorType.Right;
            numericyaxis1.Titles.Add(new Title("Sales (in $ millions)"));
            numericyaxis1.Interval = 1;

            // Create a indexed column series and add values to it
            IndexedColumnSeries columnSeries1 = new IndexedColumnSeries("Company A Sales", numericyaxis1);

            columnSeries1.Values.Add(new float[] { 2, 10, 14, 17 });
            columnSeries1.Color = RgbColor.Blue;
            IndexedColumnSeries columnSeries2 = new IndexedColumnSeries("Company B Sales", numericyaxis1);

            columnSeries2.Color = RgbColor.Lime;
            columnSeries2.Values.Add(new float[] { 7, 4, 10, 15 });

            // Create a bar column value position data label
            BarColumnValuePositionDataLabel barColumnValuePositionDataLabel = new BarColumnValuePositionDataLabel(true, true, false);

            columnSeries1.DataLabel = barColumnValuePositionDataLabel;
            barColumnValuePositionDataLabel.FontSize = 7;
            columnSeries1.DataLabel.Prefix           = "(";
            columnSeries1.DataLabel.Suffix           = ")";
            columnSeries2.DataLabel = barColumnValuePositionDataLabel;

            // Add indexed column series to the plot area
            plotArea.Series.Add(columnSeries1);
            plotArea.Series.Add(columnSeries2);
            YAxisGridLines minorGridLines = new YAxisGridLines();

            minorGridLines.LineStyle = LineStyle.Dots;
            plotArea.YAxes.DefaultNumericAxis.MajorGridLines = new YAxisGridLines();
            plotArea.YAxes.DefaultNumericAxis.MinorGridLines = minorGridLines;
            plotArea.XAxes.DefaultIndexedAxis.MajorGridLines = new XAxisGridLines();
            plotArea.YAxes.DefaultNumericAxis.MinorTickMarks = new YAxisTickMarks();
            plotArea.YAxes.DefaultNumericAxis.MajorTickMarks = new YAxisTickMarks();

            // Add title to Yaxis
            lineSeries1.YAxis.Titles.Add(new Title("Visitors (in millions)"));

            //Adding AxisLabels to the XAxis
            columnSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q1", 0));
            columnSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q2", 1));
            columnSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q3", 2));
            columnSeries1.XAxis.Labels.Add(new IndexedXAxisLabel("Q4", 3));
            chart.Legends[0].BorderStyle     = LineStyle.Dots;
            chart.Legends[0].BorderColor     = RgbColor.Black;
            chart.Legends[0].BackgroundColor = CmykColor.Lavender;
            elements.Add(chart);
        }
        public string AddLineChart(
            float x,
            ref float y,
            float width,
            float height,
            string[] seriename,
            SortedDictionary<DateTime, double> valorisationdata,
            Dictionary<DateTime, Tuple<double, double>> investissementandretraitdata = null,
            System.Action afficheLabelFunction = null,
            string datereleve=""
            )
        {
            const string axeformat = "0.### 'K€'";
            var logdata = string.Empty;
            var labelFont = 9;

            if ((valorisationdata == null || valorisationdata.Count == 0) &&
                (investissementandretraitdata == null || investissementandretraitdata.Count == 0))
            {
                return logdata;
            }
            var sumvalorisation = valorisationdata.Sum(c => c.Value);
            var summvt = investissementandretraitdata == null || investissementandretraitdata.Count == 0 ? 0 : investissementandretraitdata.Sum(d => d.Value.Item1 + d.Value.Item2);
            if (sumvalorisation == 0 && summvt == 0)
                return logdata;

            if (afficheLabelFunction != null)
                afficheLabelFunction();
            y += 40;
            Chart chart = new Chart(x, y, width, height);
            chart.Legends.Placement = LegendPlacement.TopCenter;

            PlotArea plotArea = chart.PrimaryPlotArea;
            Legend legend = chart.Legends.Add(2, 3, 10, 10);
            legend.Visible = false;

            var legendwidth = 100;
            chart.LeftPadding = -45;
            //
            //
            //
            var colorValorisation = "#094DEE";//9FCECE
            //var colorInvestissement = "#983298";
            //var colorRetrait = "#E0B64B";

            //
            //
            //
            var yAxisValorisation = new NumericYAxis();
            yAxisValorisation.AnchorType = YAxisAnchorType.Left;

            plotArea.YAxes.Add(yAxisValorisation);
            plotArea.YAxes.DefaultNumericAxis = yAxisValorisation;
            //
            //
            //


            IndexedLineSeries lineValorisation = new IndexedLineSeries(seriename[0], null, yAxisValorisation, new WebColor(colorValorisation));
            var _abs = x - 20;
            AddRectangle(_abs, y - 15, 10, 2, colorValorisation);
            AddLabelArialBold(seriename[0], _abs + 15, y - 20, 200, 50, labelFont);
            //
            //
            //
            IndexedColumnSeries lineInvestisstement = null;
            IndexedColumnSeries lineRetrait = null;
            plotArea.Series.Add(lineValorisation);
            //
            //
            //
            var dateReleve = valorisationdata.Keys.Last();
            DateTime.TryParseExact(datereleve, "dd/MM/yyyy",
                   CultureInfo.InvariantCulture,
                   DateTimeStyles.None, out dateReleve);
            //
            if (datereleve != "")
            {
                var tmpDictionnary = valorisationdata.Where(x1 => x1.Key <= dateReleve).ToDictionary(xa => xa.Key, xa => xa.Value);
                if (tmpDictionnary.Count > 0)
                {
                    valorisationdata.Clear();
                    foreach (var newVal in tmpDictionnary)
                    {
                        valorisationdata.Add(newVal.Key, newVal.Value);
                    }
                }
            }
            //
            //
            //
            #region Legend
            var dateabcisses = new List<DateTime>();
            if (seriename.Length == 3 && investissementandretraitdata != null && investissementandretraitdata.Count > 0)
            {               
                //
                //si le montant de l'investissement et de retrait est inferieur à 10% de la valeur de compte
                //
                var valorisationmax10pourcent = valorisationdata.Values.Max() * 10 / 100;
                var invesorretraitmax = Math.Max(investissementandretraitdata.Values.Max(x1 => x1.Item1), investissementandretraitdata.Values.Max(x2 => x2.Item2));
                var legendinvestX = x + 425;

                var greenColor = new RgbColor(1, 126, 3);
                var redColor = new RgbColor(254, 2, 1);

                AddRectangle(legendinvestX, y - 18, 10, 10, greenColor);
                AddLabelArialBold(seriename[1], legendinvestX + 15, y - 19, 200, 50, labelFont);
                AddRectangle(legendinvestX, y, 10, 10, redColor);
                AddLabelArialBold(seriename[2], legendinvestX + 15, y - 1, 200, 50, labelFont);

                if (invesorretraitmax < valorisationmax10pourcent)
                {
                    //Investissement = #983298
                    //Retrait = #E0B64B
                    //Valorisation = #9FCECE
                    //
                    var yAxisInvestiRetrait = new NumericYAxis();
                    yAxisInvestiRetrait.AnchorType = YAxisAnchorType.Right;
                    plotArea.YAxes.Add(yAxisInvestiRetrait);

                    lineInvestisstement = new IndexedColumnSeries(seriename[1], null, yAxisInvestiRetrait, greenColor);
                    lineRetrait = new IndexedColumnSeries(seriename[2], null, yAxisInvestiRetrait, redColor);
                    //
                    //
                    //
                    lineInvestisstement.YAxis.Labels.Font = RobotoLightBold;
                    lineInvestisstement.YAxis.Labels.FontSize = 7;
                }
                else
                {
                    lineInvestisstement = new IndexedColumnSeries(seriename[1], greenColor);
                    lineRetrait = new IndexedColumnSeries(seriename[2], redColor);
                }


                //
                //
                //
                if (investissementandretraitdata != null && investissementandretraitdata.Count > 0)
                {
                    //foreach (var line in investissementandretraitdata)
                    //{
                    //    dateabcisses.Add(line.Key);
                    //}
                }

                plotArea.Series.Add(lineInvestisstement);
                plotArea.Series.Add(lineRetrait);

                lineInvestisstement.YAxis.LabelOffset = 8;
                lineRetrait.YAxis.LabelOffset = 8;
                lineInvestisstement.YAxis.LabelFormat = axeformat;
                lineRetrait.YAxis.LabelFormat = axeformat;
                //
                //
                //
            }
            #endregion
            //
            //
            //
            #region Add Values
            var affichageparmois = false;
            var diffMonths = 0;
            var max_Month = 36;
            if (valorisationdata != null && valorisationdata.Count > 0)
            {
                var dtDebut = valorisationdata.Keys.First();
                var dtFin = dateReleve == DateTime.MinValue ? valorisationdata.Keys.Last() : dateReleve;
                diffMonths = (dtFin.Month + dtFin.Year * 12) - (dtDebut.Month + dtDebut.Year * 12) + 1;
                if (diffMonths >= max_Month)
                {
                    affichageparmois = true;
                    //si nombre de mois > max_Month , on affiche les données des max_Month mois le plus proche de nos jour
                    #region par mois
                    //
                    //
                    //
                    if (diffMonths > max_Month)
                    {
                        dtDebut = dtFin.AddMonths(-max_Month);
                    }
                    //
                    //Limiter à max_Month mois
                    //
                    dtDebut = new DateTime(dtDebut.Year, dtDebut.Month, 1);
                    while (dtDebut.Year != dtFin.Year || dtDebut.Month != dtFin.Month)
                    {
                        if (!dateabcisses.Contains(dtDebut))
                            dateabcisses.Add(dtDebut);
                        dtDebut = dtDebut.AddMonths(1);
                    }
                    if (!dateabcisses.Contains(dtDebut))
                        dateabcisses.Add(dtDebut);
                    #endregion
                }
                else
                {

                    if (diffMonths == 1)
                    {

                        if (valorisationdata.Keys.Count > 4)
                            dateabcisses.AddRange(valorisationdata.Keys);
                        else
                        {
                            var date_temp = valorisationdata.Keys.ToList();
                            var days_apresenter = date_temp.Select(x5 => x5.Day).ToList();
                            var rd = new Random();
                            for (var j = days_apresenter.Count; j < 5; j++)
                            {
                                int day = days_apresenter[0];
                                while (days_apresenter.Contains(day))
                                {
                                    day = rd.Next(1, 28);
                                }
                                days_apresenter.Add(day);

                                var dt = new DateTime(date_temp[0].Year, date_temp[0].Month, day);
                                if (!dateabcisses.Contains(dt))
                                    dateabcisses.Add(dt);
                            }
                            dateabcisses.AddRange(date_temp);//5 points
                        }
                    }
                    else
                    {
                        //si nombre de mois < max_Month (ex : 7), on regarde combien de point dans un mois on doit afficher pour avoir max_Month
                        var nbrePointafficherparmois = (diffMonths < 4) ? 12 : (int)max_Month / diffMonths;
                        var restePointafficher = (diffMonths < 4) ? 0 : max_Month % diffMonths;
                        //
                        //Recuperer les mois qui n'ont pas de valorisation
                        //
                        var date_temp = valorisationdata.Keys.ToList();
                        for (var k = 0; k < diffMonths; k++)
                        {
                            var currentdate = dtDebut.AddMonths(k);
                            var firstdatemonth = valorisationdata.Keys.FirstOrDefault(x1 => x1.Year == currentdate.Year && x1.Month == currentdate.Month);
                            if (firstdatemonth == DateTime.MinValue)
                            {
                                date_temp.Add(new DateTime(currentdate.Year, currentdate.Month, 1));
                            }
                        }
                        //
                        //
                        //
                        var rd = new Random();
                        date_temp = date_temp.OrderByDescending(x2 => x2).ToList();
                        for (var k = 0; k < diffMonths; k++)
                        {
                            var pt_aafficher = (k < diffMonths - restePointafficher) ? nbrePointafficherparmois : nbrePointafficherparmois + 1;
                            var date_apresenter = date_temp.Where(x1 => x1.Year == dtDebut.Year && x1.Month == dtDebut.Month).Take(pt_aafficher).ToList();

                            if (date_apresenter.Count < pt_aafficher)
                            {
                                var days_apresenter = date_apresenter.Select(x5 => x5.Day).ToList();
                                for (var j = date_apresenter.Count; j < pt_aafficher; j++)
                                {
                                    int day = days_apresenter[0];
                                    while (days_apresenter.Contains(day))
                                    {
                                        day = rd.Next(1, 28);
                                    }
                                    days_apresenter.Add(day);

                                    var dt = new DateTime(date_apresenter[0].Year, date_apresenter[0].Month, day);
                                    if (!date_apresenter.Contains(dt))
                                        date_apresenter.Add(dt);
                                }
                            }
                            //Ajouter valorisation
                            dateabcisses.AddRange(date_apresenter);
                            dtDebut = dtDebut.AddMonths(1);
                        }
                    }
                }
                diffMonths = dateabcisses.Count;
            }

            var showcustomdate = (dateabcisses.Count < 9);
            if (dateabcisses.Count > 0)
            {
                lineValorisation.XAxis.Labels.AutoLabels = false;
                lineValorisation.YAxis.Labels.Font = RobotoLightBold;
                lineValorisation.YAxis.Labels.FontSize = 7;

                if (lineInvestisstement != null)
                    lineInvestisstement.XAxis.Labels.AutoLabels = false;
                if (lineRetrait != null)
                    lineRetrait.XAxis.Labels.AutoLabels = false;

                var index = 0;

                dateabcisses = dateabcisses.OrderBy(z => z).ToList();
                var culture = new CultureInfo("fr-Fr");
                var intervalcount = dateabcisses.Count - 1;
                var graphwidth = chart.Width - legendwidth + 50;

                var pas = dateabcisses.Count / 12;
                var rest = dateabcisses.Count % 12;
                pas += (rest > 0) ? 1 : 0;

                var keysOrderDesc = valorisationdata.Keys.OrderByDescending(x1 => x1).ToList();
                var defaulkey = keysOrderDesc.FirstOrDefault(x1 => x1 <= dateabcisses[0]);
                if (defaulkey == DateTime.MinValue)
                    defaulkey = keysOrderDesc.Last();

                double currentvalorisation = valorisationdata[defaulkey];

                var investKeys = investissementandretraitdata != null ? investissementandretraitdata.Keys.OrderByDescending(x1 => x1).ToList() : null;

                if (affichageparmois)
                {
                    //si nombre de mois > max_Month , on affiche les données des max_Month mois le plus proche de nos jour
                    foreach (var dateabs in dateabcisses)
                    {
                        var akey = keysOrderDesc.FirstOrDefault(x1 => x1.Year == dateabs.Year && x1.Month == dateabs.Month);

                        currentvalorisation = (valorisationdata.ContainsKey(akey)) ? valorisationdata[akey] : currentvalorisation;
                        lineValorisation.Values.Add(Convert.ToSingle(currentvalorisation) / 1000);

                        logdata += string.Format(" ({0},{1}) ", dateabs.ToString("MM/yyyy"), currentvalorisation);

                        if (investissementandretraitdata != null && investissementandretraitdata.Count > 0)
                        {
                            var key = investKeys.FirstOrDefault(x1 => x1.Month == dateabs.Month && x1.Year == dateabs.Year);
                            if (key != DateTime.MinValue)
                            {
                                if (lineInvestisstement != null)
                                    lineInvestisstement.Values.Add(Convert.ToSingle(investissementandretraitdata[key].Item1) / 1000);
                                if (lineRetrait != null)
                                    lineRetrait.Values.Add(Convert.ToSingle(investissementandretraitdata[key].Item2) / 1000);
                            }
                            else
                            {
                                if (lineInvestisstement != null)
                                    lineInvestisstement.Values.Add(0);
                                if (lineRetrait != null)
                                    lineRetrait.Values.Add(0);
                            }
                        }
                        //var monthname = culture.DateTimeFormat.GetMonthName(dateabs.Month);
                        //var monthyear = monthname.Length > 3 ?
                        //    string.Format("{0} {1}", culture.DateTimeFormat.GetMonthName(dateabs.Month).Substring(0, 4), dateabs.Year) :
                        //    string.Format("{0} {1}", culture.DateTimeFormat.GetMonthName(dateabs.Month).Substring(0, 3), dateabs.Year);
                        if (!showcustomdate)
                        {
                            if (pas == 0 || (pas > 0 && index % pas == 0) || index == diffMonths - 1)
                            {
                                var xLabel = new IndexedXAxisLabel(FormatIndexedLabel(dateabs), index, RobotoLightBold, 6, RgbColor.Black);
                                lineValorisation.XAxis.Labels.Add(xLabel);
                            }
                        }
                        else
                        {
                            lineValorisation.XAxis.Labels.Add(new IndexedXAxisLabel(FormatIndexedLabel(dateabs), index, RobotoLightBold, 6, RgbColor.Black));
                        }
                        index++;
                    }
                }
                else
                {
                    var monthyear = string.Empty;
                    index = 0;
                    var month_eltindex = 0;
                    foreach (var dateabs in dateabcisses)
                    {

                        currentvalorisation = (valorisationdata.ContainsKey(dateabs)) ? valorisationdata[dateabs] : currentvalorisation;
                        lineValorisation.Values.Add(Convert.ToSingle(currentvalorisation) / 1000);

                        var monthname = culture.DateTimeFormat.GetMonthName(dateabs.Month);
                        var dateabs_afficher = monthname.Length > 3 ?
                            string.Format("{0} {1}", culture.DateTimeFormat.GetMonthName(dateabs.Month).Substring(0, 4), dateabs.Year) :
                            string.Format("{0} {1}", culture.DateTimeFormat.GetMonthName(dateabs.Month).Substring(0, 3), dateabs.Year);

                        if (monthyear != dateabs_afficher)
                        {
                            month_eltindex = 0;
                        }

                        if (investissementandretraitdata != null && investissementandretraitdata.Count > 0)
                        {
                            var investmonth = investKeys.Where(x1 => x1.Month == dateabs.Month && x1.Year == dateabs.Year).ToList();
                            if (investmonth.Count > month_eltindex)
                            {
                                var key = investmonth[month_eltindex];
                                //var key = investKeys.FirstOrDefault(x1 => x1.Month == dateabs.Month && x1.Year == dateabs.Year);
                                if (key != DateTime.MinValue)
                                {
                                    if (lineInvestisstement != null)
                                        lineInvestisstement.Values.Add(Convert.ToSingle(investissementandretraitdata[key].Item1) / 1000, index);
                                    if (lineRetrait != null)
                                        lineRetrait.Values.Add(Convert.ToSingle(investissementandretraitdata[key].Item2) / 1000, index);
                                }
                                else
                                {
                                    if (lineInvestisstement != null)
                                        lineInvestisstement.Values.Add(0);
                                    if (lineRetrait != null)
                                        lineRetrait.Values.Add(0);
                                }
                            }
                        }
                        if (month_eltindex == 0)
                        {
                            if (dateabcisses.Count == max_Month)
                            {
                                lineValorisation.XAxis.Labels.Add(new IndexedXAxisLabel(FormatIndexedLabel(dateabs), index, RobotoLightBold, 6, RgbColor.Black));
                            }
                            else
                                lineValorisation.XAxis.Labels.Add(new IndexedXAxisLabel(dateabs_afficher, index, RobotoLightBold, 6, RgbColor.Black));
                        }
                        monthyear = dateabs_afficher;
                        index++;
                        month_eltindex++;
                    }
                }
    
            }
            #endregion

            // Create a numeric x axis and Xaxis gridlines
            var axeColor = new Gradient(0, 0, 200, 200, new RgbColor(235, 235, 235), new RgbColor(220, 220, 220));
            var yGrid = new YAxisGridLines();
            var xGrid = new XAxisGridLines();

            yGrid.Color = axeColor;
            xGrid.Color = axeColor;

            plotArea.YAxes.DefaultNumericAxis.MajorGridLines = yGrid;
            lineValorisation.XAxis.MajorGridLines = xGrid;
            lineValorisation.YAxis.LabelOffset = 8;
            ////
            ////
            ////
            lineValorisation.YAxis.LabelFormat = axeformat;
            if (lineRetrait != null && lineRetrait.YAxis != null)
            {
                lineRetrait.YAxis.LabelFormat = axeformat;
                lineInvestisstement.YAxis.LabelFormat = axeformat;
            }
            //
            //
            //
            y += height;
            _currentPage.Elements.Add(chart);
            lineValorisation.XAxis.Labels.Angle = 25;

            return logdata;
        }