在System.Windows.Forms.DataVisualization.Charting中设置Point Label的位置

时间:2017-12-19 22:22:31

标签: c# .net

使用System.Windows.Forms.DataVisualization.Charting库,折线图标签的定位非常糟糕。

默认情况下,标签有时位于线上而不是上方或下方。

label unreadable

如果在系列

上设置了SmartLabelStyle
series.SmartLabelStyle = new SmartLabelStyle()
{
    MovingDirection = LabelAlignmentStyles.Top | LabelAlignmentStyles.Bottom,
};

标签不再水平移动,但较高点的标签可放置在下方,而较小点的标签位于上方!

labels are layer confusingly

有没有办法明确放置点标签?

1 个答案:

答案 0 :(得分:1)

这可以通过图表上的PostPaint事件来完成。 这里有一些文档和教程:https://msdn.microsoft.com/en-us/library/dd456612.aspx

在我的图表的限制范围内工作的有限解决方案,对于遇到此问题的任何人都可能有所帮助。

chart.PostPaint += (sender, args) =>
{
    for (var j = 0; j < 2; j++)
    {
        for (var i = 0; i < args.Chart.Series[j].Points.Count; i++)
        {
            var point = args.Chart.Series[j].Points[i];
            var altPoint = args.Chart.Series[j == 0 ? 1 : 0].Points[i];
            var above = point.YValues[0] > altPoint.YValues[0] || (point.YValues[0] == altPoint.YValues[0] && j == 0);

            var pos = PointF.Empty;
            pos.X =
                (float)
                args.ChartGraphics.GetPositionFromAxis("ChartArea1", AxisName.X,
                    point.XValue);
            pos.Y =
                (float)
                args.ChartGraphics.GetPositionFromAxis("ChartArea1", AxisName.Y,
                    point.YValues[0]);

            pos = args.ChartGraphics.GetAbsolutePoint(pos);
            pos.Y += (above ? - 20 : 10);
            pos.X += -10;
            args.ChartGraphics.Graphics.DrawString($"{values[j][i]}%",
                new Font(FontFamily.GenericSansSerif, 10),
                new SolidBrush(_colorPallette[j]), pos);
        }
    }
};

enter image description here