C# MSChart - 如何创建两个共享同一坐标轴的并排饼图?

3
我想创建两个并排的饼图,共享同一轴。有没有使用MSChart实现这个目标的代码示例?以下是我想要实现的示例: Example of what I want to achieve 以下是我目前的代码:
        Chart chart = new Chart();
        chart.Width = 800;
        string PreContractSeriesName = "PreContract";
        string ContractSeriesName = "Contract";

        //two chart areas
        chart.ChartAreas.Add(PreContractSeriesName);
        chart.ChartAreas.Add(ContractSeriesName);

        //two pie charts, so two series
        chart.Series.Add(PreContractSeriesName);
        chart.Series.Add(ContractSeriesName);

        //add series to chart area
        chart.Series[PreContractSeriesName].ChartArea = PreContractSeriesName;
        chart.Series[ContractSeriesName].ChartArea = ContractSeriesName;

        //set as pie chart
        chart.Series[PreContractSeriesName].ChartType = SeriesChartType.Pie;
        chart.Series[ContractSeriesName].ChartType = SeriesChartType.Pie;

        chart.ChartAreas[PreContractSeriesName].AlignmentOrientation = AreaAlignmentOrientations.Horizontal;
        chart.ChartAreas[ContractSeriesName].AlignmentOrientation = AreaAlignmentOrientations.Horizontal;

        chart.Series[PreContractSeriesName].Points.AddXY("source1", 100);
        chart.Series[PreContractSeriesName].Points.AddXY("source2", 200);
        chart.Series[PreContractSeriesName].Points.AddXY("source3", 300);
        chart.Series[PreContractSeriesName].Points.AddXY("source4", 400);
        chart.Series[PreContractSeriesName].Points.AddXY("source5", 500);

        chart.Series[ContractSeriesName].Points.AddXY("source1", 140);
        chart.Series[ContractSeriesName].Points.AddXY("source2", 240);
        chart.Series[ContractSeriesName].Points.AddXY("source3", 340);
        chart.Series[ContractSeriesName].Points.AddXY("source4", 440);
        chart.Series[ContractSeriesName].Points.AddXY("source5", 540);

        using (MemoryStream memStream = new MemoryStream())
        {
            chart.SaveImage(memStream, ChartImageFormat.Jpeg);

            return File(memStream.ToArray(), "image/jpeg");
        }

我的代码会产生以下重叠的图表:

enter image description here

我想知道:
  1. 如何将图表并排对齐?
  2. 这是共享轴的正确方式吗?
  3. 有没有人有实现这个的例子?
编辑:

感谢用户TaW,以下是我的更新代码:

        Chart chart = new Chart();
        chart.Width = 800;
        string PreContractSeriesName = "PreContract";
        string ContractSeriesName = "Contract";

        //two chart areas
        chart.ChartAreas.Add(PreContractSeriesName);
        chart.ChartAreas.Add(ContractSeriesName);

        //two pie charts, so two series
        chart.Series.Add(PreContractSeriesName);
        chart.Series.Add(ContractSeriesName);

        //add series to chart area
        chart.Series[PreContractSeriesName].ChartArea = PreContractSeriesName;
        chart.Series[ContractSeriesName].ChartArea = ContractSeriesName;

        //position chart areas side by side
        chart.ChartAreas[PreContractSeriesName].Position = new ElementPosition(2, 5, 48, 80);
        chart.ChartAreas[ContractSeriesName].Position = new ElementPosition(50, 5, 48, 80);


        chart.Legends.Add(new Legend() {
            Alignment = StringAlignment.Center,
            Docking = Docking.Bottom }
        );
        chart.Series[ContractSeriesName].IsVisibleInLegend = false;

        //set as pie chart
        chart.Series[PreContractSeriesName].ChartType = SeriesChartType.Pie;
        chart.Series[ContractSeriesName].ChartType = SeriesChartType.Pie;

        chart.Series[PreContractSeriesName].Points.AddXY("source1", 100);
        chart.Series[PreContractSeriesName].Points.AddXY("source2", 200);
        chart.Series[PreContractSeriesName].Points.AddXY("source3", 300);
        chart.Series[PreContractSeriesName].Points.AddXY("source4", 400);
        chart.Series[PreContractSeriesName].Points.AddXY("source5", 500);

        chart.Series[ContractSeriesName].Points.AddXY("source1", 140);
        chart.Series[ContractSeriesName].Points.AddXY("source2", 240);
        chart.Series[ContractSeriesName].Points.AddXY("source3", 340);
        chart.Series[ContractSeriesName].Points.AddXY("source4", 440);
        chart.Series[ContractSeriesName].Points.AddXY("source5", 540);

当你使用调试器时会发生什么?仅仅发布代码并期望别人逐步执行它对任何人都没有好处。你能说明一下你现有代码的问题和/或问题吗? - MethodMan
@MethodMan,谢谢。我已经编辑了我的帖子,包括我正在经历的结果,并提出了更具体的问题。 - Ben
1个回答

4

enter image description here

以下是如何在一个图表中对齐两个ChartAreas ca1 和ca2的方法:

ca1.Position = new ElementPosition(2, 5, 48, 80);
ca2.Position = new ElementPosition(50, 5, 48, 80);
chart.Legends[0].Docking = Docking.Bottom;
chart.Legends[0].Alignment = StringAlignment.Center;

请注意,这将硬编码位置为图表大小的百分比。
您尝试的对齐属性实际上是关于对齐数据而不是定位图表区域。请查看它们的AreaAlignmentStyles!要控制ChartArea的放置,我们需要保留默认的Auto设置并选择自己的数字。
我在左右各留了2%,使两个ChartAreas直接相邻。我添加了颜色,以便您可以清楚地看到每个部分。
我在底部留下了15%的空间给Legend,它被停靠在底部并居中显示。
您将想要使用自己的数字。
还要注意,默认情况下,两个饼图各自获得其自己的图例条目。要抑制一个系列的条目,您可以设置一个Series S2的该属性:
S2.IsVisibleInLegend = false;

另一个例子 看这里!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接