Как сделать круговую диаграмму с помощью MSChart?

Я скачал образцы MS Chart, и в галерее он показывает "3DPieInPie.png", что я и хочу, но не вижу никакого кода для его создания!

Предположительно это ChartType = SeriesChartType.Pie... но есть ли другой параметр, который указывает, что я хочу второй пирог? А как ввести второй набор данных? - Я пытался добавить новую серию, но это, кажется, игнорируется.

2 ответа

Решение

Этот тип диаграммы называется вложенной круговой диаграммой или многоуровневой круговой диаграммой. Это делается путем создания двух ChartArea - круговой диаграммы и кольцевой диаграммы, которые правильно расположены друг относительно друга. Вот код ниже.

      public partial class Form1 : Form
{
    public class DataInt {
        public string Label { get; set; }
        public int Value { get; set; } }
    public Form1()
    {
        InitializeComponent();
        pieChart.Series.Clear();
        pieChart.Legends.Clear();
        float baseDoughnutWidth = 25;
        float outerSize = 80;
         
        ChartArea outerArea = new ChartArea("OUTER_AREA");
        outerArea.Position = new ElementPosition(0, 10, 100, 100);
        outerArea.InnerPlotPosition = new ElementPosition((100 - outerSize) / 2, (100 - outerSize) / 2, outerSize, outerSize);
        outerArea.BackColor = Color.Transparent;
         
        pieChart.ChartAreas.Add(outerArea);
         
        float innerSize = 53;
       
        ChartArea innerArea = new ChartArea("INNER_AREA");
        innerArea.Position = new ElementPosition(0, 5, 100, 100);
        ElementPosition innerPos = new ElementPosition((100 - innerSize) / 2, ((100 - innerSize) / 2), innerSize, innerSize+5);
        innerArea.InnerPlotPosition = innerPos;
        innerArea.BackColor = Color.Transparent;
        pieChart.ChartAreas.Add(innerArea);
       
        Series outerSeries = new Series("OUTER_SERIES");
        outerSeries.ChartArea = "OUTER_AREA";
        outerSeries.ChartType = SeriesChartType.Doughnut;            
        outerSeries["DoughnutRadius"] = Math.Min(baseDoughnutWidth * (100 / outerSize), 99).ToString().Replace(",", ".");
                    
        Series innerSeries = new Series("INNER_SERIES");
        innerSeries.ChartArea = "INNER_AREA";
        innerSeries.ChartType = SeriesChartType.Pie;

        var innerData = new List<DataInt> { new DataInt { Label = "A", Value = 7 }, 
           new DataInt { Label = "B", Value = 14 }, new DataInt{Label="C",Value=19},
           new DataInt{Label="D",Value=12}, new DataInt{Label="E",Value=20},
             new DataInt{Label="F",Value=28} };

        var outerData = new List<DataInt> { new DataInt { Label = "Gold", Value = 21 },
           new DataInt{Label="Red",Value=31}, new DataInt { Label = "Blue", Value = 48 } };

        innerSeries.Points.DataBindXY(innerData, "Label", innerData, "Value");
        outerSeries.Points.DataBindXY(outerData, "Label", outerData, "Value");

        pieChart.Series.Add(innerSeries);
        pieChart.Series.Add(outerSeries);

        Legend legend = new Legend("pieChartLegend")
        {
            Font=new System.Drawing.Font("Arial",14.0f),
            Alignment = StringAlignment.Center,
            Docking = Docking.Top,
            Enabled = true,
            IsDockedInsideChartArea = false,
            TableStyle = LegendTableStyle.Wide,
        };
     
        pieChart.Legends.Add(legend);
        foreach (Series sr in pieChart.Series)
        {
            sr.Legend = "pieChartLegend";
        }
        var outerAreaColors = new List<Color>(){Color.Gold,Color.Red, Color.DeepSkyBlue };
        var innerAreaColors = new List<Color>() {Color.Goldenrod,Color.DarkGoldenrod,  Color.DarkRed, Color.Firebrick,Color.DodgerBlue,  Color.SteelBlue };
        for (int i = 0; i < outerSeries.Points.Count; i++)
        {
            outerSeries.Points[i].Color = outerAreaColors[i];
        }
        for (int i = 0; i < innerSeries.Points.Count; i++)
        {
            innerSeries.Points[i].Color = ChartColorPallets.Inner[i];
        }

        int inclination = 20;
        int rotation = 45;
        bool enable3d = true;

        pieChart.ChartAreas["OUTER_AREA"].Area3DStyle.Enable3D = enable3d;
        pieChart.ChartAreas["OUTER_AREA"].Area3DStyle.Inclination = inclination;
        pieChart.ChartAreas["OUTER_AREA"].Area3DStyle.Rotation = rotation;

        pieChart.ChartAreas["INNER_AREA"].Area3DStyle.Enable3D = enable3d;
        pieChart.ChartAreas["INNER_AREA"].Area3DStyle.Inclination = inclination;
        pieChart.ChartAreas["INNER_AREA"].Area3DStyle.Rotation = rotation;            
    }
}
Другие вопросы по тегам