繁体   English   中英

图表X轴编号

[英]chart x-axis numbering

我正在使用WinForms图表来可视化一些数据。 我想在我指定的点使用x轴网格线。 请看下面的例子。

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

在图表中,您可以看到X轴的网格线出现在19、39、59、79和99。但是我希望它在0、15、45、65、90、100中。 您可以清楚地看到间隔是不一样的。 因此,设置时间间隔是没有用的。 我自己的指定点是否可以有网格线?

图表图像

GridLines不可能做到这一点,因为它们将始终以固定的Interval间隔绘制。 这是通过在xxxPaint事件中画线来解决问题的xxxPaint

首先,我们声明所需的GridLines的终止值列表:

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

然后我们准备图表:

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

请注意,我添加了一个额外的值50.5 ),以显示即使没有DataPoints我们也可以绘制GridLines

然后我们编写PostPaint事件:

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

结果如下:

在此处输入图片说明

请注意, PostPaint事件中的大多数代码只是准备工作。 线条和标签的两个实际图形调用是普通的GDI+方法。

请注意,我已经在循环中的第10个点添加了DataPoint标签,以显示我们的位置:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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