【问题标题】:Let column charts overlap in Chart Control让柱形图在图表控件中重叠
【发布时间】:2016-11-25 09:07:00
【问题描述】:

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

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

Plotting overlapping column or bar chart

Chart control two data set bars overlapping

谢谢。

【问题讨论】:

    标签: c# winforms charts mschart


    【解决方案1】:

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

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

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

    这对于 column 和 bar 类型来说并不容易,因为没有暴露列的大小。

    另外请注意,重叠的列确实有点难以阅读,尤其是。当你也有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

    结果如下:

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

      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”处,列消失。

    【讨论】:

    • 谢谢,但图表是否只是在扭转?我需要看起来像 StackedColumn Chart 的东西
    • 它们不是转弯而是移动的,因此它们重叠。为什么要堆叠列时要求重叠列? '看起来像 StackedColumn Chart 的东西' 是什么意思?你的意思是 StackedColumn 图表吗?所以你有它!现在你只需要follow the rules 来创建一个!!
    • 这个问题可能会帮助想要自己绘制列的读者。我建议你让问题保持原样,1) 尝试使用 StackedColumn 图表,当你遇到问题时提出一个新的、更好的问题,包括所有细节,最好包括屏幕截图!
    • Actzally 可以重写以通过 1) 设置最大值和 2) 计算堆叠的矩形而不是移位的矩形来堆叠列。但这会阻止与列的任何正确交互,因为绘制的列的高度与真实的高度不同,例如工具提示或命中测试会遇到问题..
    • 抱歉。我的错。是的你是对的!谢谢! :)
    【解决方案2】:

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

    series1.CustomProperties = "DrawSideBySide=False";
    

    也可以在IDE中进行设置,进入属性窗口,系列集合编辑器,然后找到CustomProperties,DrawSideBySide。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多