【问题标题】:Pie Chart transparency, multiple Pies饼图透明度,多个饼图
【发布时间】:2015-05-05 10:53:43
【问题描述】:

我想将两个饼图堆叠在一起。这里的想法是让其中一个更小,这样你就只能看到后面的饼图的外环。我尝试使用:

chartCalProgres.BackColor = Color.Transparent;
chartCalProgres.ChartAreas[0].BackColor = Color.Transparent;

但正如您在下面的链接中看到的那样,它不起作用。有人知道如何实现这种效果吗?

Pie Charts

Should look like this

【问题讨论】:

  • 这些图表只是两个位图还是动态生成的?
  • 动态生成,使用程序时会发生变化。

标签: c# winforms charts transparency pie-chart


【解决方案1】:

饼图无法做到这一点,但您可以使用 ChartType.Doughnut 很好地完成它:

步骤如下:

1 我们需要有两个 Series 和两个 ChartAreas

2 我们需要控制 CA 的 Position、Size 和 InnerPlotPosition。它们必须重叠并具有正确的尺寸..

3 我们还需要控制我们使用的两个Series的DoughnutRadius。这是内半径。

4 最后我们需要将内部Series的Backcolor设置为Transparent。

这是设置我的示例的代码:

    using System.Windows.Forms.DataVisualization.Charting;
    //..

    Random R = new Random(); //Added to allow code to work
    chart1.Series.Clear();
    Series S1 = chart1.Series.Add("Pie1");
    Series S2 = chart1.Series.Add("Pie2");

    chart1.ChartAreas.Clear();

    ChartArea CA1 = chart1.ChartAreas.Add("Outer");
    ChartArea CA2 = chart1.ChartAreas.Add("Inner");

    CA1.Position = new ElementPosition(0, 0, 100, 100);
    CA2.Position = new ElementPosition(0, 0, 100, 100);

    float innerSize = 60;
    float outerSize = 100;
    float baseDoughnutWidth = 25;

    CA1.InnerPlotPosition = new ElementPosition((100 - outerSize) / 2,
            (100 - outerSize) / 2 + 10, outerSize, outerSize - 10);

    CA2.InnerPlotPosition = new ElementPosition((100 - innerSize) / 2,
            (100 - innerSize) / 2 + 10, innerSize, innerSize - 10);

    S1["DoughnutRadius"] = 
     Math.Min(baseDoughnutWidth * (100 / outerSize), 99).ToString().Replace(",", ".");
    S2["DoughnutRadius"] = 
     Math.Min(baseDoughnutWidth * (100 / innerSize), 99).ToString().Replace(",", ".");
    

    S1.ChartArea = CA1.Name;
    S2.ChartArea = CA2.Name;

    S1.ChartType = SeriesChartType.Doughnut;
    S2.ChartType = SeriesChartType.Doughnut;

    CA2.BackColor = Color.Transparent;
    S1["DoughnutRadius"] = "41"; // leave just a little space!
    S2["DoughnutRadius"] = "99"; // 99 is the limit. a tiny spot remains open

    // test data, optional, R is a Random instance
    for (int i = 0; i < 7; i++)
    {
        S1.Points.AddXY(i, 42 - R.Next(44));
        S2.Points.AddXY(i, 77 - R.Next(88));
    }
}

注意设置 DoughnutRadius 的奇怪方式;另请注意,图表中的许多数字是图表控件大小的百分比..!

我找到了代码here,感谢fireblade123,Escener Technologies!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2012-04-15
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多