我正在使用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。你可以清楚地看到间隔不一样。因此设置间隔是没有用的。是否可以在我自己的指定点中使用网格线?
答案 0 :(得分:0)
GridLines
无法实现这一点,因为它们始终以固定的Interval
间距绘制。以下是通过在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
)来展示我们如何绘制GridLines
即使不是DataPoints
的地方也是如此!
然后我们对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";