custom label on x-axis

26,269

This is possible by adding a custom label for every x value, so for each year.

Dim series1 As New Series("Series1")
series1.ChartType = SeriesChartType.Column

' Adding some points
series1.Points.AddXY(1, 1)
series1.Points.AddXY(2, 1)
series1.Points.AddXY(3, 1)

Chart1.Series.Add(series1)

' I manually set the maxium of the X axis
Chart1.ChartAreas("ChartArea1").AxisX.Interval = 1
Chart1.ChartAreas("ChartArea1").AxisX.Maximum = 4

Chart1.ChartAreas("ChartArea1").AxisX.CustomLabels.Add(0.5, 1.5, "yr1")
Chart1.ChartAreas("ChartArea1").AxisX.CustomLabels.Add(1.5, 2.5, "yr2")
Chart1.ChartAreas("ChartArea1").AxisX.CustomLabels.Add(2.5, 3.5, "yr3")

If a point has a x-value of '1', then you should add the customlabel from '0.5' to '1.5'. That way it centers nicely.

Share:
26,269
MrFox
Author by

MrFox

Updated on November 03, 2020

Comments

  • MrFox
    MrFox over 3 years

    My chart predicts a value for the next 30 years. The first value must be displayed as year 1. Then year 5, 10... until 30. But internally the first year is 0 and is left off:

    enter image description here

    I tried adding a custom label, but it only breaks the other labels: enter image description here

    If I add it to AxisX2 instead of AxisX it does nothing. Here is the code to make the chart and add the lines:

    public static Chart MakeChart(string title)
    {
        var chart = new Chart();
    
        var area = new ChartArea("GrafiekGebied");
    
        foreach (var axis in area.Axes)
        {
            axis.TitleForeColor = defaultColor;
            axis.LineColor = defaultColor;
            axis.InterlacedColor = defaultColor;
            axis.LabelStyle.Font = letterType;
            axis.LabelAutoFitMinFontSize = (int)letterType.Size;
            axis.LabelAutoFitMaxFontSize = (int)letterType.Size;
            axis.MajorGrid.LineColor = defaultColor;
            axis.MajorTickMark.Enabled = false;
            axis.MinorGrid.LineColor = defaultColor;
            axis.MinorTickMark.LineColor = defaultColor;
        }
    
        CustomLabel firstXlabel = new CustomLabel();
        firstXlabel.FromPosition = 0;
        firstXlabel.ToPosition = 0;
        firstXlabel.RowIndex = 0; // Also tried 1
        firstXlabel.Text = "1jr";
    
        area.AxisY.LineWidth = 0;
        area.AxisY.LabelStyle.Format = "€{#,##}";
        area.AxisX.TextOrientation = TextOrientation.Horizontal;
        area.AxisX.CustomLabels.Add(firstXlabel); // Adding it to AxisX2 does nothing
        area.AxisX.IsMarginVisible = true;
        area.AxisX.MajorGrid.Enabled = false;
        area.AxisX.IntervalOffset = 1;
        area.AxisX.LabelStyle.Format = "{#}jr";
        area.AxisX.MajorTickMark.Enabled = true;
        area.AxisX2.LineWidth = 1;
        area.AxisX2.LineColor = Color.Green;
    
        var legend = new Legend();
        legend.LegendStyle = LegendStyle.Row;
        legend.Docking = Docking.Bottom;
        legend.DockedToChartArea = area.Name;
        legend.Font = lettering;
        legend.IsDockedInsideChartArea = false;
    
        chart.ForeColor = defaultColor;
        chart.Font.Name = lettering.FontFamily.Name;
        chart.Font.Size = new System.Web.UI.WebControls.FontUnit(lettering.Size);
        chart.Width = 280;
        chart.Height = 180;
        chart.Legends.Add(legend);
        chart.ChartAreas.Add(area);
        chart.BorderlineColor = defaultColor;
        chart.BorderlineWidth = 1;
        chart.BorderlineDashStyle = ChartDashStyle.Solid;
        chart.Titles.Add(title);
    
        return chart;
    }
    
    public static void AddData(Chart chart, ChartInput input)
    {
        var line = new Series(input.Subtitle);
        line.ChartArea = chart.ChartAreas[0].Name;
        line.ChartType = SeriesChartType.Spline;
        line.Color = input.Color;
        line.BorderWidth = 3;
        line.MarkerStyle = MarkerStyle.Circle;
        line.MarkerSize = 7;
        line.MarkerStep = 5;
    
        for (int i = 0; i < input.Waarden.Length; i++)
        {
            line.Points.AddXY(i, input.Values[i]);
        }
    
        chart.Series.Add(line);
    }
    

    After making the graph it's inserted in a word document using Aspose, but that should not matter for how the chart is made.