简体   繁体   中英

How to change X-axis datetime value jan-01 to Oct-01 using .net chart control

I am trying to show x axis value in the form of date(MMM-yy) but it is always begin with jan-01. So please provide solution to display other then jan-01, I mean instead of Jan-01 show oct-01.

Please find the simulated function :

    private static void drawGraph()
    {
        List<GraphPoints> listGP = new List<GraphPoints>();
        listGP.Add(new GraphPoints()
        {
            RecordDate = "01/10/1984",
            benchmark = "10000.00"
        });

        listGP.Add(new GraphPoints()
        {
            RecordDate = "29/06/1987",
            benchmark = "30396.00"
        });

        listGP.Add(new GraphPoints()
        {
            RecordDate = "31/05/1989",
            benchmark = "10000.00"
        });

        listGP.Add(new GraphPoints()
        {
            RecordDate = "30/09/1993",
            benchmark = "310137.88"
        });

        listGP.Add(new GraphPoints()
        {
            RecordDate = "31/12/2015",
            benchmark = "440037.28"
        });


        Graph.Chart chart;

        chart = new Graph.Chart();
        chart.Location = new System.Drawing.Point(10, 10);
        chart.Size = new System.Drawing.Size(800, 300);

        chart.ChartAreas.Add("draw");

        chart.ChartAreas["draw"].AxisX.IntervalType = Graph.DateTimeIntervalType.Years;
        chart.ChartAreas["draw"].AxisX.LabelStyle.Format = "MMM-yyyy";
        chart.ChartAreas["draw"].AxisX.MajorGrid.LineColor = Color.Black;
        chart.ChartAreas["draw"].AxisX.MajorGrid.LineDashStyle = Graph.ChartDashStyle.NotSet;

        chart.ChartAreas["draw"].AxisY.IntervalAutoMode = Graph.IntervalAutoMode.VariableCount;
        chart.ChartAreas["draw"].AxisY.MajorGrid.LineColor = Color.Black;
        chart.ChartAreas["draw"].AxisY.MajorGrid.LineDashStyle = Graph.ChartDashStyle.NotSet;

        chart.ChartAreas["draw"].BackColor = Color.White;



        chart.Series.Add("Bench-Mark");         
        chart.Series["Bench-Mark"].XValueType = Graph.ChartValueType.Date;
        chart.Series["Bench-Mark"].ChartType = Graph.SeriesChartType.Line;            
        chart.Series["Bench-Mark"].Color = Color.Red;
        chart.Series["Bench-Mark"].BorderWidth = 1;

        foreach (var item in listGP)
        {
            chart.Series["Bench-Mark"].Points.AddXY(Convert.ToDateTime(item.RecordDate).ToOADate(), item.benchmark);
        }

        chart.SaveImage("MyImage.jpg", Graph.ChartImageFormat.Jpeg);
    }

在此处输入图片说明

See Graph axis points are showing from jan 1988.

There is a nice page on MSDN on various types of labels.

It explains three types of labelling:

  • Using the Label of the AxisX.LabelStyle.Format and Axis.Interval property to create a regular grid of labels not really connected to the data points
  • Using the DataPoint.AxisLabel property to label each DataPoint individually
  • Using CustomLabels to set labels at arbitrary points on an axis.

You are using the first option but this will put a Label at the beginning of one unit of the AxisX.IntervalType which in your case will be years even if you switch to Months because there simply are too few points.

This really should be simple to correct; since you do not want the IntervalType units labelled but the individual DataPoints , you should add AxisLabels to each DataPoint and all ought to be well:

Series S1 = chart.Series["Bench-Mark"];
foreach (var item in listGP)
{
    DateTime dt = Convert.ToDateTime(item);
    int p = S1.Points.AddXY(dt, listGP[item]);
    string l = dt.ToString("MMM-yyyy");
    S1.Points[p].AxisLabel = l;
}

Unfortunately with your data, the Chart control's built-in 'intelligence' makes this a bit harder; the issue is that no matter which combination of Interval and IntervalType you choose it just never will show each AxisLabel . In fact I only managed to display those that actually hit the Interval , ie DataPoints the fall the 1st of a month. But your data are randomly spread out over several years.

But you can use CustomLabels as a workaround. After adding the AxisLabels in the code above call this little helper function to add CustomLabels ; we need to tell the Chart for which range each is to be displayed, and with a large enough range they all show up where they should (according to my data):

void addCustomLabels(Chart chart)
{
    Series S1 = chart.Series[0];
    ChartArea CA = chart.ChartAreas[0];
    CA.AxisX.CustomLabels.Clear();
    for (int i = 0; i < S1.Points.Count; i++)
    {
        CustomLabel cl = new CustomLabel();
        cl.FromPosition = S1.Points[i].XValue - 10;  // 10 day back and ahead..
        cl.ToPosition = S1.Points[i].XValue + 10;   //..will be enough space for one label
        cl.Text = S1.Points[i].AxisLabel;
        CA.AxisX.CustomLabels.Add(cl);
    }
}

在此处输入图片说明

Note that such a solution will only work well if your data points are as sparse as in the example; for many points the labels would clutter the axis.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM