有问题的条形图(表格MC图表)

时间:2017-01-20 15:51:04

标签: c# forms winforms charts stackedbarseries

我想在条形图中绘制52 Bar系列来表示一年中的周数。但是,图表似乎存在问题,如下图所示:

enter image description here

我有2个系列,我用标签,x值,y值绘制。 E.g:

chart1.Series["Data"].Points.AddXY("W1", 0, 168);
chart1.Series["Missing"].Points.AddXY("W1", 0, 0);

然而,即使我用相同的方法创建它们,条形系列之间似乎也存在差异(某些条纹较厚,有时甚至是smiller):

  var series = new Series
        {
            Name = seriesName,
            ChartArea = chartAreaName,
            Color = color,
            ChartType = SeriesChartType.RangeBar,
            XValueType = ChartValueType.Auto,
            YValueType = ChartValueType.Auto,
            SmartLabelStyle = new SmartLabelStyle
            {
                AllowOutsidePlotArea = LabelOutsidePlotAreaStyle.Yes,
                MovingDirection = LabelAlignmentStyles.Right,
                IsMarkerOverlappingAllowed = false
            }
        };

如何防止这种形式发生?

1 个答案:

答案 0 :(得分:0)

效果是由于具有如此大量的条形而产生的舍入效果。

为避免这种情况,您必须确保InnerPlotPosition.Height的像素数可被52整除。

有一个抗锯齿属性..:

chart.AntiAliasing = AntiAliasingStyles.All;

..但默认情况下它已设置为All

计算最接近的尺寸并不像人们希望的那么简单。对于计算InnerPlotPosition的方法,您可以看到here,并且在图表仍在使用自动值时,您可以使用ToRectangleF();强制执行计算数字。

但由于这些数字是百分比而其他元素,即标题,图例和带有标签的x轴都在称重,反转计算以找到一个有效的数字不仅很难,它也会失败每次调整Chart的大小。并且,显然,当添加更多点..

如果您可以在不调整大小的情况下生活,则可以通过反复试验找到合适的chart.Size,例如通过按钮点击增加它:chart.Height += 1;

但是,最好的解决方案是自己以受控方式减少条形宽度,也许是这样:

  yourSeries.SetCustomProperty("PixelPointWidth", "3");

效果仍然很好,但如果差距较大,则不会那么明显。