我正在使用Visual Studio中的System.Windows.Forms.DataVisualization.Charting
C#库。
然而,创建图形本身没有问题,因为我使用SeriesChartType.StackedArea100
作为我的系列(它总是填充100%的垂直图形空间),网格(X& Y)完全由图形覆盖。
但是,我希望X网格位于图形之上,因此更容易看出哪个点属于什么。
我错过了一些明显的东西吗?
答案 0 :(得分:2)
Gridlines
始终位于DataPoints
。
一种选择是使Colors
的{{1}}半透明。
以下是一个例子:
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
。
但要获得正确的循环和坐标,您需要:
DrawLine
,Minimum
&轴为Maximum
。如果他们没有设置但仍然在他们的自动值上,你需要找到一种方法来实现它们。 Interval
的矩形,以像素为单位(!)。有关可以帮助您的两个功能,请参阅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