图表 - 在图表上方设置网格

时间:2016-06-13 08:15:55

标签: c# charts

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

但是,我希望X网格位于图形之上,因此更容易看出哪个点属于什么。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

Gridlines始终位于DataPoints

一种选择是使Colors的{​​{1}}半透明。

以下是一个例子:

enter image description here

DataPoints

你可以将alpha提升到224但仍然可以看到这些行。

或者您可以在其中一个chart1.ApplyPaletteColors(); // necessary to access the original colors if (checkBox1.Checked) { foreach (Series s in chart1.Series) s.Color = Color.FromArgb(192, s.Color); } 个活动中所有者绘制 GridLines;但那当然有点复杂。好的,还有很多......

绘图本身是常规的GDI +绘图,在两个循环中调用xxxPaint

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

  • 确保您了解/控制DrawLineMinimum&轴为Maximum。如果他们没有设置但仍然在他们的自动值上,你需要找到一种方法来实现它们。
  • 知道Interval的矩形,以像素为单位(!)。有关可以帮助您的两个功能,请参阅here

以下是一个例子:

enter image description here

InnerPlotPosition

您应该停用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(); } ,甚至可以使GridLines透明:

Axes