让柱形图在图表控件中重叠

Let column charts overlap in Chart Control

我有以下问题: 我需要在图表控件中显示多个列(一个图表区域中大约有七个系列)。现在,当我有一个 "Column" 类型的图表时,所有七列都会并排显示。我想做的是重叠它们。这可能吗?

以下两个解决方案对我没有帮助:

Plotting overlapping column or bar chart

Chart control two data set bars overlapping

谢谢。

没有内置方法可以做到这一点。

  • 一种解决方法是打开 3-d,但这将完全改变图表的外观..

  • 另一个是所有者绘制图表。

这对于柱形和条形类型来说并不容易,因为没有公开柱的大小。

另请注意,重叠的列确实会变得更难阅读,尤其是。当你还有 Labels.

这是一个所有者绘制的柱形图的示例。它有几个简化:

所有 Series 点数相同且对齐,所有 y 值为正且没有其他修饰。他们可能都会被克服,但可能需要一些额外的努力..

private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
    if (!checkBox2.Checked) return;

    int sMax = chart1.Series.Count;
    ChartArea ca = chart1.ChartAreas[0];
    Axis ax = ca.AxisX;
    Axis ay = ca.AxisY;
    float py0 = (float)ay.ValueToPixelPosition(ay.Minimum);
    Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
    int pMax = chart1.Series[0].Points.Count;
    float shift = (overlap * sMax) / 2f;
    float deltaX = 1f * ipr.Width / (pMax+1);
    float colWidth = 1f * deltaX / sMax;

    for (int j = 0; j < chart1.Series.Count; j++)
        for (int i = 0; i < chart1.Series[j].Points.Count; i++)
        {
            DataPoint dp = chart1.Series[j].Points[i];
            float px = (float)ax.ValueToPixelPosition(dp.XValue);
            float py = (float)ay.ValueToPixelPosition(dp.YValues[0]);
            using (SolidBrush brush = new SolidBrush(chart1.Series[j].Color))
                e.ChartGraphics.Graphics.FillRectangle(brush, 
                    px + j * colWidth - deltaX / 2 - overlap * j + shift,   py,
                    colWidth, py0 -  py );
        }
}

它使用了一个函数 InnerPlotPositionClientRectangle,您可以找到 here

结果如下:

请注意,要访问系列颜色,您需要将它们 添加到图表:

  chart1.ApplyPaletteColors();

列宽设置如下:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    for (int j = 0; j < chart1.Series.Count; j++)
        chart1.Series[j]["PointWidth"] = numericUpDown1.Value.ToString();
}

在“0”时,列消失。

Column Series 有一个名为 DrawSideBySide 的 CustomProperties,将其设置为 False 将导致列绘制重叠。

series1.CustomProperties = "DrawSideBySide=False";

也可以在 IDE 中设置,方法是转到属性 window、系列集合编辑器,然后找到 CustomProperties、DrawSideBySide。