ChartDirector 6.0 (Perl Edition)

Variable Width Bar Chart




This example demonstrates a bar chart with variable bar widths.

ChartDirector does not really have a bar layer for variable width bars. However, an area layer can be used to create the same effect.

The variable width bars in this example are actually 4 areas, created by 4 area layers. The data set for each area layer consists of 4 points for the 4 corners of a bar.

Source Code Listing

[Standalone Version] perldemo\varwidthbar.pl
#!/usr/bin/perl

# In the sample code, the ChartDirector for Perl module is assumed to be in "../lib"
use File::Basename;
use lib (dirname($0)."/../lib") =~ /(.*)/;

use perlchartdir;

# The data for the chart
my $data = [800, 600, 1000, 1400];
my $widths = [250, 500, 960, 460];
my $labels = ["Wind", "Hydro", "Coal", "Natural Gas"];

# The colors to use
my $colors = [0x00aa00, 0x66aaee, 0xee6622, 0xffbb00];

# Create a XYChart object of size 500 x 350 pixels
my $c = new XYChart(500, 350);

# Add a title to the chart using 15pt Arial Italic font
$c->addTitle("Energy Generation Breakdown", "ariali.ttf", 15);

# Set the plotarea at (60, 60) and of (chart_width - 90) x (chart_height - 100) in size. Use a
# vertical gradient color from light blue (f9f9ff) to sky blue (aaccff) as background. Set grid
# lines to white (ffffff).
my $plotAreaBgColor = $c->linearGradientColor(0, 60, 0, $c->getHeight() - 40, 0xaaccff, 0xf9fcff);
$c->setPlotArea(60, 60, $c->getWidth() - 90, $c->getHeight() - 100, $plotAreaBgColor, -1, -1,
    0xffffff);

# Add a legend box at (50, 30) using horizontal layout and transparent background.
$c->addLegend(55, 30, 0)->setBackground($perlchartdir::Transparent);

# Add titles to x/y axes with 10 points Arial Bold font
$c->xAxis()->setTitle("Mega Watts", "arialbd.ttf", 10);
$c->yAxis()->setTitle("Cost per MWh (dollars)", "arialbd.ttf", 10);

# Set the x axis rounding to false, so that the x-axis will fit the data exactly
$c->xAxis()->setRounding(0, 0);

# In ChartDirector, there is no bar layer that can have variable bar widths, but you may create a
# bar using an area layer. (A bar can be considered as the area under a rectangular outline.) So by
# using a loop to create one bar per area layer, we can achieve a variable width bar chart.

# starting position of current bar
my $currentX = 0;

for(my $i = 0; $i < scalar(@$data); ++$i) {
    # ending position of current bar
    my $nextX = $currentX + $widths->[$i];

    # outline of the bar
    my $dataX = [$currentX, $currentX, $nextX, $nextX];
    my $dataY = [0, $data->[$i], $data->[$i], 0];

    # create the area layer to fill the bar
    my $layer = $c->addAreaLayer($dataY, $colors->[$i], $labels->[$i]);
    $layer->setXData($dataX);

    # the ending position becomes the starting position of the next bar
    $currentX = $nextX;
}

# Output the chart
$c->makeChart("varwidthbar.png")

[CGI Version] perldemo_cgi\varwidthbar.pl
#!/usr/bin/perl

# In the sample code, the ChartDirector for Perl module is assumed to be in "../lib"
use File::Basename;
use lib (dirname($0)."/../lib") =~ /(.*)/;

use perlchartdir;

# The data for the chart
my $data = [800, 600, 1000, 1400];
my $widths = [250, 500, 960, 460];
my $labels = ["Wind", "Hydro", "Coal", "Natural Gas"];

# The colors to use
my $colors = [0x00aa00, 0x66aaee, 0xee6622, 0xffbb00];

# Create a XYChart object of size 500 x 350 pixels
my $c = new XYChart(500, 350);

# Add a title to the chart using 15pt Arial Italic font
$c->addTitle("Energy Generation Breakdown", "ariali.ttf", 15);

# Set the plotarea at (60, 60) and of (chart_width - 90) x (chart_height - 100) in size. Use a
# vertical gradient color from light blue (f9f9ff) to sky blue (aaccff) as background. Set grid
# lines to white (ffffff).
my $plotAreaBgColor = $c->linearGradientColor(0, 60, 0, $c->getHeight() - 40, 0xaaccff, 0xf9fcff);
$c->setPlotArea(60, 60, $c->getWidth() - 90, $c->getHeight() - 100, $plotAreaBgColor, -1, -1,
    0xffffff);

# Add a legend box at (50, 30) using horizontal layout and transparent background.
$c->addLegend(55, 30, 0)->setBackground($perlchartdir::Transparent);

# Add titles to x/y axes with 10 points Arial Bold font
$c->xAxis()->setTitle("Mega Watts", "arialbd.ttf", 10);
$c->yAxis()->setTitle("Cost per MWh (dollars)", "arialbd.ttf", 10);

# Set the x axis rounding to false, so that the x-axis will fit the data exactly
$c->xAxis()->setRounding(0, 0);

# In ChartDirector, there is no bar layer that can have variable bar widths, but you may create a
# bar using an area layer. (A bar can be considered as the area under a rectangular outline.) So by
# using a loop to create one bar per area layer, we can achieve a variable width bar chart.

# starting position of current bar
my $currentX = 0;

for(my $i = 0; $i < scalar(@$data); ++$i) {
    # ending position of current bar
    my $nextX = $currentX + $widths->[$i];

    # outline of the bar
    my $dataX = [$currentX, $currentX, $nextX, $nextX];
    my $dataY = [0, $data->[$i], $data->[$i], 0];

    # create the area layer to fill the bar
    my $layer = $c->addAreaLayer($dataY, $colors->[$i], $labels->[$i]);
    $layer->setXData($dataX);

    # the ending position becomes the starting position of the next bar
    $currentX = $nextX;
}

# Output the chart
binmode(STDOUT);
print "Content-type: image/png\n\n";
print $c->makeChart2($perlchartdir::PNG);