【问题标题】:C# MSChart - How can I create two pie graphs side by side sharing the same axis?C# MSChart - 如何并排创建两个共享同一轴的饼图?
【发布时间】:2016-06-20 17:42:39
【问题描述】:

我正在尝试并排创建两个共享同一轴的饼图。有没有人有使用 MSChart 完成此操作的代码示例?

我想要实现的示例:

到目前为止,这是我的代码:

        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");
        }

我的代码生成以下图表:

我想知道:

  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,谢谢。我编辑了我的帖子以包含我遇到的结果并提出了更具体的问题。

标签: c# charts mschart


【解决方案1】:

以下是如何在Chart 图表中对齐两个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 直接并排坐下。我已经添加了颜色,所以你可以看到是什么..

我在底部为Legend 留下了 15%,它停靠在底部并居中。

您会想要使用自己的号码。

另请注意,默认情况下,两个饼图各有自己的图例条目。要抑制一组条目,您可以设置一个 Series S2 的此属性:

S2.IsVisibleInLegend = false;

再举个例子see here!

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多