ChartDirector Ver 3.0 (C++ Edition)

Multi-Stacked Bar Chart




A multi-stacked bar chart combines the stacked bar chart style with the multi- bar chart style. The bars are cluster together as in a multi-bar chart, but each bar is itself a stacked bar.

A mutli-stacked bar can be created by separating the data sets into groups. Data sets within the same group will be stacked. The stacked bars are then clustered together.

This example illustrates a number of ChartDirector features. The key ones are:

Source Code Listing

[The following project is available in "cppdemo/multistackbar".]
#include "chartdir.h" int main(int argc, char *argv[]) { //The data for the bar chart double data0[] = {44, 55, 100}; double data1[] = {97, 87, 167}; double data2[] = {156, 78, 147}; double data3[] = {125, 118, 211}; //The labels for the bar chart. The labels contains embedded images as //icons. const char *labels[] = {"<*img=service.png*>\nService", "<*img=software.png*>\nSoftware", "<*img=computer.png*>\nHardware"}; //Create a XYChart object of size 600 x 350 pixels, using 0xe0e0ff as the //background color, 0xccccff as the border color, with 1 pixel 3D border //effect. XYChart *c = new XYChart(600, 350, 0xe0e0ff, 0xccccff, 1); //Add a title to the chart using 14 points Times Bold Itatic font and light //blue (0x9999ff) as the background color c->addTitle("Business Results 2001 vs 2002", "timesbi.ttf", 14 )->setBackground(0x9999ff); //Set the plotarea at (60, 45) and of size 500 x 210 pixels, using white //(0xffffff) as the background c->setPlotArea(60, 45, 500, 210, 0xffffff); //Swap the x and y axes to create a horizontal bar chart c->swapXY(); //Add a title to the y axis using 11 pt Times Bold Italic as font c->yAxis()->setTitle("Revenue (millions)", "timesbi.ttf", 11); //Set the labels on the x axis c->xAxis()->setLabels(StringArray(labels, sizeof(labels)/sizeof(*labels))); //Disable x-axis ticks by setting the tick length to 0 c->xAxis()->setTickLength(0); //Add a stacked bar layer to the chart BarLayer *layer = c->addBarLayer(Stack); //Add the first two data sets to the chart as a stacked bar group layer->addDataGroup("2001"); layer->addDataSet(DoubleArray(data0, sizeof(data0)/sizeof(*data0)), 0xaaaaff, "Local"); layer->addDataSet(DoubleArray(data1, sizeof(data1)/sizeof(*data1)), 0x6666ff, "International"); //Add the remaining data sets to the chart as another stacked bar group layer->addDataGroup("2002"); layer->addDataSet(DoubleArray(data2, sizeof(data2)/sizeof(*data2)), 0xffaaaa, "Local"); layer->addDataSet(DoubleArray(data3, sizeof(data3)/sizeof(*data3)), 0xff6666, "International"); //Set the sub-bar gap to 0, so there is no gap between stacked bars with a //group layer->setBarGap(0.2, 0); //Set the bar border to transparent layer->setBorderColor(Transparent); //Set the aggregate label format layer->setAggregateLabelFormat("Year {dataGroupName}\n{value} millions"); //Set the aggregate label font to 8 point Arial Bold Italic layer->setAggregateLabelStyle("arialbi.ttf", 8); //Reverse 20% space at the right during auto-scaling to allow space for the //aggregate bar labels c->yAxis()->setAutoScale(0.2); //Add a legend box at (300, 300) using TopCenter alignment, with horizontal //layout, and using 8 pt Arial Bold Italic as the font LegendBox *legendBox = c->addLegend(300, 300, false, "arialbi.ttf", 8); legendBox->setAlignment(TopCenter); //Set the legend box width to 500 pixels (height = automatic) legendBox->setSize(500, 0); //Set the format of the text displayed in the legend box legendBox->setText("Year {dataGroupName} {dataSetName} Revenue"); //Set the background and border of the legend box to transparent legendBox->setBackground(Transparent, Transparent); //output the chart c->makeChart("multistackbar.png"); //free up resources delete c; return 0; }