2016-03-08 56 views
0

我想以日期(MMM-yy)的形式顯示x軸值,但始終以jan-01開頭。所以請提供解決方案,以顯示其他然後jan-01,我的意思,而不是01年1月顯示oct-01。如何使用.net圖表控件將X軸日期時間值jan-01更改爲Oct-01

請找到模擬功能:

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); 
    } 

enter image description here

見圖表軸點是從1988年一月

+0

嘗試設置'chart.ChartAreas [「draw」]。AxisX.LabelStyle.IntervalType = DateTimeIntervalType.Months;' – TaW

+0

沒有更改graph.Its與我在上面提到的相同。 – subu

回答

0

顯示有上MSDN一個不錯的頁面上各種類型的標籤。

它解釋了三種類型的標籤:

  • 使用AxisX.LabelStyle.FormatAxis.Interval屬性的標籤來創建沒有真正連接到數據點
  • 使用DataPoint.AxisLabel屬性標記每個標籤的規則網格DataPoint單獨使用
  • 使用CustomLabels在軸的任意點設置標籤。

您正在使用的第一選擇,但是這將會把一個LabelAxisX.IntervalType而你的情況將是年,即使你切換到Months因爲根本太少點中的一個單元的開始。

這確實應該很簡單,以糾正;因爲你不希望標記爲IntervalType單位但個別DataPoints,你應該添加AxisLabels每個DataPoint和所有應該是好:

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; 
} 
與您的數據

不幸的是,Chart控制內置的「智能系統」使這有點困難;問題是無論你選擇Interval還是IntervalType哪個組合,都不會顯示每個AxisLabel。事實上,我只設法顯示那些實際上擊中Interval,即DataPoints一個月的第一個秋天。但是您的數據在數年內隨機分佈。可以使用CustomLabels作爲解決方法。在上面的代碼中加入AxisLabels後調用這個小助手函數來添加CustomLabels;我們需要告訴Chart爲此範圍內的每個被顯示,並配有足夠大的範圍內都顯示,他們應該(根據數據):

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); 
    } 
} 

enter image description here

請注意,如果您的數據點爲稀疏(如示例中所示),則此類解決方案只能正常工作;對於很多點標籤將會是雜波的軸。