C# 图表-在图形上方设置网格

C# 图表-在图形上方设置网格,c#,charts,C#,Charts,我正在使用Visual Studio中的System.Windows.Forms.DataVisualization.ChartingC#库。 但是,创建图形本身并没有问题,因为我使用的是SeriesChartType.StackedArea100用于我的系列(总是100%填充垂直图形空间),网格(X&Y)完全被图形覆盖 但是,我希望X网格位于图形上方,这样更容易看到哪个点属于哪个 我是否遗漏了一些明显的内容?网格线总是在数据点下绘制 一个选项是使数据点的颜色半透明 以下是一个例子: 您可以将

我正在使用Visual Studio中的
System.Windows.Forms.DataVisualization.Charting
C#库。 但是,创建图形本身并没有问题,因为我使用的是
SeriesChartType.StackedArea100
用于我的系列(总是100%填充垂直图形空间),网格(X&Y)完全被图形覆盖

但是,我希望X网格位于图形上方,这样更容易看到哪个点属于哪个


我是否遗漏了一些明显的内容?

网格线总是在
数据点下绘制

一个选项是使
数据点的
颜色
半透明

以下是一个例子:

您可以将alpha提高到224,仍然可以看到这些线

或者您可以在一个
xxxPaint
事件中所有者绘制
网格线
;但这当然有点复杂。好的,还有很多

图形本身是常规GDI+图形,带有两个循环中的
DrawLine
调用

但要获得正确的循环和坐标,您需要:

  • 确保您知道/控制轴的
    最小值
    最大值
    间隔
    。如果它们没有设置,但仍在其自动值上,则需要找到一种方法来获取它们
  • 知道
    InnerPlotPosition
    的矩形(以像素(!)为单位)。请参阅,以了解将对您有所帮助的两个功能
以下是一个例子:


您可以使数据点颜色为半透明。或者在“后期绘制”事件中绘制网格。您可以通过图表上的工具提示来显示数据点值。@TaW:听起来不错,您自己有没有办法用该事件绘制网格?图表为
CursorX.IsUserSelectionEnabled=true
,因此用户可以选择图表的范围,放大并滚动。如何开始在适当的X坐标上绘制适当数量的直线和曲线?有没有什么可以让我省去自己完全实施它的工作@sowjanyaattaluri:谢谢,我已经在这么做了,但是我使用了超过20个系列,所以每次查看工具提示都会变得单调乏味。谢谢你!我猜画网格线是通过标准的钢笔和画笔来完成的?如果我不能实现它,我将求助于使用降低不透明度的颜色。这非常有用,非常感谢您的所有努力,现在这个问题在各个方面都彻底解决了。
chart1.ApplyPaletteColors();  // necessary to access the original colors
if (checkBox1.Checked)
{
    foreach (Series s in chart1.Series) s.Color = Color.FromArgb(192, s.Color);
}
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
    if (checkBox1.Checked) return;

    ChartArea ca = chart1.ChartAreas[0];
    RectangleF ipar = InnerPlotPositionClientRectangle(chart1, ca);
    Axis ax = ca.AxisX;
    Axis ay = ca.AxisY;
    Color gc = ax.MajorGrid.LineColor;
    Pen pen = new Pen(gc); 
    double ix = ax.Interval == 0 ? 1 : ax.Interval;  // best make sure to set..
    double iy = ay.Interval == 0 ? 50 : ay.Interval; // ..the intervals!

    for (double vx = ax.Minimum; vx <= ax.Maximum; vx+= ix)
    {
        int x = (int)ax.ValueToPixelPosition(vx) + 1;
        e.ChartGraphics.Graphics.DrawLine(pen, x, ipar.Top, x, ipar.Bottom);
    }

    for (double vy = ay.Minimum; vy <= ay.Maximum; vy += iy)
    {
        int y = (int)ay.ValueToPixelPosition(vy) + 1;
        e.ChartGraphics.Graphics.DrawLine(pen, ipar.Left, y, ipar.Right, y);
    }
    pen.Dispose();
}
chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisX.LineColor = Color.Transparent;
chart1.ChartAreas[0].AxisY.LineColor = Color.Transparent;