Create 100% stacked bar chart in PowerPoint in C#

A 100% stacked bar chart is a chart type designed to show the relative percentage of multiple data series in stacked bars, where the total of each stacked bar always equals 100%. This article will demonstrate how to use Spire.Presentation to create 100% stacked bar in PowerPoint in C#.

Step 1: Create a Presentation object.

Presentation presentation = new Presentation();

Step 2: Add a "Bar100PercentStacked" chart to the first slide.

presentation.SlideSize.Type = SlideSizeType.Screen16x9;
SizeF slidesize = presentation.SlideSize.Size;
var slide = presentation.Slides[0];

RectangleF rect = new RectangleF(20, 20, slidesize.Width - 40, slidesize.Height - 40);
IChart chart = slide.Shapes.AppendChart(Spire.Presentation.Charts.ChartType.Bar100PercentStacked, rect);

Step 3: Write data to the chart data.

string[] columnlabels = { "Series 1", "Series 2", "Series 3" };

// Insert the column labels
String[] cols = columnlabels.ToArray();
for (Int32 c = 0; c < cols.Count(); ++c)
    chart.ChartData[0, c + 1].Text = cols[c];

string[] rowlabels = { "Category 1", "Category 2", "Category 3" };

// Insert the row labels
String[] rows = rowlabels.ToArray();
for (Int32 r = 0; r < rows.Count(); ++r)
    chart.ChartData[r + 1, 0].Text = rows[r];

double[,] values = new double[3, 3] { { 20.83233, 10.34323, -10.354667 }, { 10.23456, -12.23456, 23.34456 }, { 12.34345, -23.34343, -13.23232 }};

// Insert the values
double value = 0.0;
for (Int32 r = 0; r < rows.Count(); ++r)
{
    for (Int32 c = 0; c < cols.Count(); ++c)
    {
        value = Math.Round(values[r, c], 2);
        chart.ChartData[r + 1, c + 1].Value = value;
    }
}

chart.Series.SeriesLabel = chart.ChartData[0, 1, 0, columnlabels.Count()];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, rowlabels.Count(), 0];

chart.PrimaryCategoryAxis.Position = AxisPositionType.Left;
chart.SecondaryCategoryAxis.Position = AxisPositionType.Left;
chart.PrimaryCategoryAxis.TickLabelPosition = TickLabelPositionType.TickLabelPositionLow;

Step 4: Set the data, font and format for the series of each column.

for (Int32 c = 0; c < cols.Count(); ++c)
 {
     chart.Series[c].Values = chart.ChartData[1, c + 1, rowlabels.Count(), c + 1];
     chart.Series[c].Fill.FillType = FillFormatType.Solid;
     chart.Series[c].InvertIfNegative = false;

     for (Int32 r = 0; r < rows.Count(); ++r)
     {
         var label = chart.Series[c].DataLabels.Add();
         label.LabelValueVisible = true;
         chart.Series[c].DataLabels[r].HasDataSource = false;
         chart.Series[c].DataLabels[r].NumberFormat = "0#\\%";
         chart.Series[c].DataLabels.TextProperties.Paragraphs[0].DefaultCharacterProperties.FontHeight = 12;
     }
 }
 chart.Series[0].Fill.SolidColor.Color = Color.YellowGreen;
 chart.Series[1].Fill.SolidColor.Color = Color.Red;
 chart.Series[2].Fill.SolidColor.Color = Color.Green;

 TextFont font = new TextFont("Tw Cen MT");

Step 5: Set the font and size for chartlegend.

for (int k = 0; k < chart.ChartLegend.EntryTextProperties.Length; k++)
 {
     chart.ChartLegend.EntryTextProperties[k].LatinFont = font;
     chart.ChartLegend.EntryTextProperties[k].FontHeight = 20;
 }

Step 6: Save the document to file.

presentation.SaveToFile("Sample.pptx", FileFormat.Pptx2010);

Effective screenshot of 100% stacked bar chart:

Create 100% stacked bar chart in PowerPoint in C#

Full codes:

using Spire.Presentation;
using Spire.Presentation.Charts;
using Spire.Presentation.Drawing;
using System;
using System.Drawing;
using System.Linq;

namespace BarChart
{
    class Program
    {
        static void Main(string[] args)
        {
            Presentation presentation = new Presentation();
            presentation.SlideSize.Type = SlideSizeType.Screen16x9;
            SizeF slidesize = presentation.SlideSize.Size;

            var slide = presentation.Slides[0];

            RectangleF rect = new RectangleF(20, 20, slidesize.Width - 40, slidesize.Height - 40);
            IChart chart = slide.Shapes.AppendChart(Spire.Presentation.Charts.ChartType.Bar100PercentStacked, rect);

            string[] columnlabels = { "Series 1", "Series 2", "Series 3" };

            String[] cols = columnlabels.ToArray();
            for (Int32 c = 0; c < cols.Count(); ++c)
                chart.ChartData[0, c + 1].Text = cols[c];

            string[] rowlabels = { "Category 1", "Category 2", "Category 3" };

            String[] rows = rowlabels.ToArray();
            for (Int32 r = 0; r < rows.Count(); ++r)
                chart.ChartData[r + 1, 0].Text = rows[r];

            double[,] values = new double[3, 3] { { 20.83233, 10.34323, -10.354667 }, { 10.23456, -12.23456, 23.34456 }, { 12.34345, -23.34343, -13.23232 } };

            double value = 0.0;
            for (Int32 r = 0; r < rows.Count(); ++r)
            {
                for (Int32 c = 0; c < cols.Count(); ++c)
                {
                    value = Math.Round(values[r, c], 2);
                    chart.ChartData[r + 1, c + 1].Value = value;
                }
            }

            chart.Series.SeriesLabel = chart.ChartData[0, 1, 0, columnlabels.Count()];
            chart.Categories.CategoryLabels = chart.ChartData[1, 0, rowlabels.Count(), 0];

            chart.PrimaryCategoryAxis.Position = AxisPositionType.Left;
            chart.SecondaryCategoryAxis.Position = AxisPositionType.Left;
            chart.PrimaryCategoryAxis.TickLabelPosition = TickLabelPositionType.TickLabelPositionLow;

            for (Int32 c = 0; c < cols.Count(); ++c)
            {
                chart.Series[c].Values = chart.ChartData[1, c + 1, rowlabels.Count(), c + 1];
                chart.Series[c].Fill.FillType = FillFormatType.Solid;
                chart.Series[c].InvertIfNegative = false;

                for (Int32 r = 0; r < rows.Count(); ++r)
                {
                    var label = chart.Series[c].DataLabels.Add();
                    label.LabelValueVisible = true;
                    chart.Series[c].DataLabels[r].HasDataSource = false;
                    chart.Series[c].DataLabels[r].NumberFormat = "0#\\%";
                    chart.Series[c].DataLabels.TextProperties.Paragraphs[0].DefaultCharacterProperties.FontHeight = 12;
                }
            }
            chart.Series[0].Fill.SolidColor.Color = Color.YellowGreen;
            chart.Series[1].Fill.SolidColor.Color = Color.Red;
            chart.Series[2].Fill.SolidColor.Color = Color.Green;

            TextFont font = new TextFont("Tw Cen MT");

            for (int k = 0; k < chart.ChartLegend.EntryTextProperties.Length; k++)
            {
                chart.ChartLegend.EntryTextProperties[k].LatinFont = font;
                chart.ChartLegend.EntryTextProperties[k].FontHeight = 20;
            }

            presentation.SaveToFile("Sample.pptx", FileFormat.Pptx2010);
        }
    }
}