2017-06-04 2 views
1

Ich verwende WinForms-Diagramm, um einige Daten zu visualisieren. Ich möchte X-Achsen-Gitternetzlinien an den von mir angegebenen Punkten. Bitte sehen Sie sich das folgende Beispiel an.Diagramm X-Achsen-Nummerierung

public partial class Form1: Form 
{ 
    public Form1() 
    { 
     InitializeComponent();    
     AddPoints(); 
    } 

    public void AddPoints() 
    { 
     for (int i = 0; i <= 100; i++) 
      chart1.Series[0].Points.AddXY(i, i); 
    } 
} 

In der Tabelle können Sie die Rasterlinien für X-Achse erscheint bei 19,39,59,79 und 99. Aber ich will es in 0,15,45,65,90,100 sehen können. Sie können deutlich sehen, dass das Intervall nicht das gleiche ist. Das Einstellen des Intervalls ist also nutzlos. Ist es möglich, Rasterlinien an meinem eigenen Punkt zu haben?

chart image

Antwort

0

Dies ist nicht möglich mit GridLines, da sie immer an dem festen Interval Abstand gezogen werden. Hier ist ein Beispiel von rund arbeiten, indem sie die Linien in einem xxxPaint Ereignis Zeichnung ..

Zuerst haben wir eine Liste mit Stoppwerte für die GridLines erklären wir wollen:

List<double> stops = new List<double>(); 

Dann bereiten wir das Diagramm:

AddPoints(); 

ChartArea ca = chart1.ChartAreas[0]; 
ca.AxisX.Minimum = 0; // optional 
ca.AxisX.MajorGrid.Enabled = false; 
ca.AxisX.MajorTickMark.Enabled = false; 
ca.AxisX.LabelStyle.Enabled = false; 

stops.AddRange(new[] { 0, 15, 45, 50.5, 65, 90, 100 }); 

Bitte beachte, dass ich hinzugefügt haben einen zusätzlichen Wert (50.5) zu zeigen, wie wir GridLines selbst ziehen können, wo nicht DataPoints sind!

Dann kodieren wir das PostPaint Ereignis:

private void chart1_PostPaint(object sender, ChartPaintEventArgs e) 
{ 
    Graphics g = e.ChartGraphics.Graphics; 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; 

    ChartArea ca = chart1.ChartAreas[0]; 

    Font font = ca.AxisX.LabelStyle.Font; 
    Color col = ca.AxisX.MajorGrid.LineColor; 
    int padding = 10; // pad the labels from the axis 

    int y0 = (int)ca.AxisY.ValueToPixelPosition(ca.AxisY.Minimum); 
    int y1 = (int)ca.AxisY.ValueToPixelPosition(ca.AxisY.Maximum); 

    foreach (int sx in stops) 
    { 
     int x = (int)ca.AxisX.ValueToPixelPosition(sx); 

     using (Pen pen = new Pen(col)) 
      g.DrawLine(pen, x, y0, x, y1); 

     string s = sx + ""; 
     if (ca.AxisX.LabelStyle.Format != "") 
      s = string.Format(ca.AxisX.LabelStyle.Format, s); 

     SizeF sz = g.MeasureString(s, font, 999); 
     g.DrawString(s, font, Brushes.Black, (int)(x - sz.Width/2) , y0 + padding); 
} 

Dies ist das Ergebnis:

enter image description here

Beachten Sie, dass die meisten der Code in der PostPaint Ereignis nur Vorbereitung ist; die beiden eigentlichen Zeichnung fordert, dass die Linien und die Etiketten sind gewöhnliche GDI+ Methoden ..

Bitte beachte, dass ich DataPoint Etiketten zu jedem 10. Punkt in der Schleife hinzugefügt haben, zu zeigen, wo wir sind:

chart1.Series[0].Points.AddXY(i, i); 
if (i%10 == 0) chart1.Series[0].Points[i].Label = "#VAL/#VALY"; 
+0

Danke so viel, TaW. – Viknesh

Verwandte Themen