summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKore Nordmann <github@kore-nordmann.de>2009-07-14 14:13:45 +0000
committerKore Nordmann <github@kore-nordmann.de>2009-07-14 14:13:45 +0000
commit11e6744455cadf222f828a437e095205da53da7a (patch)
treed85b763feeb930ebc2f29394475241bab0931561
parent8262fb03d006afdc4ea1ea6c21be991178510137 (diff)
downloadzetacomponents-graph-11e6744455cadf222f828a437e095205da53da7a.zip
zetacomponents-graph-11e6744455cadf222f828a437e095205da53da7a.tar.gz
- Implemented: #13341: Vertical Bar Charts
-rw-r--r--ChangeLog1
-rw-r--r--src/charts/horizontal_bar.php292
-rw-r--r--src/charts/line.php74
-rw-r--r--src/graph_autoload.php17
-rw-r--r--src/interfaces/horizontal_bar_renderer.php48
-rw-r--r--src/renderer/horizontal_bar.php177
-rw-r--r--tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderBasicHorizontalBarChart.svg2
-rw-r--r--tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartMultipleBars.svg2
-rw-r--r--tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartNegativeValues.svg2
-rw-r--r--tests/horizontal_bar_chart_renderer.php96
-rw-r--r--tests/suite.php2
11 files changed, 674 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index c83358f..fc54b34 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Implemented: #14294: Add option for axis label rotation
+- Implemented: #13341: Vertical Bar Charts
1.4.3 - Monday 08 June 2009
diff --git a/src/charts/horizontal_bar.php b/src/charts/horizontal_bar.php
new file mode 100644
index 0000000..7e4e4a0
--- /dev/null
+++ b/src/charts/horizontal_bar.php
@@ -0,0 +1,292 @@
+<?php
+/**
+ * File containing the ezcGraphBarChart class
+ *
+ * @package Graph
+ * @version //autogentag//
+ * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+/**
+ * Class for bar charts. Can make use of an unlimited amount of datasets and
+ * will display them as bars by default.
+ * X axis:
+ * - Labeled axis
+ * - Boxed axis label renderer
+ * Y axis:
+ * - Numeric axis
+ * - Exact axis label renderer
+ *
+ * <code>
+ * // Create a new horizontal bar chart
+ * $chart = new ezcGraphHorizontalBarChart();
+ *
+ * // Add data to line chart
+ * $chart->data['sample dataset'] = new ezcGraphArrayDataSet(
+ * array(
+ * '100' => 1.2,
+ * '200' => 43.2,
+ * '300' => -34.14,
+ * '350' => 65,
+ * '400' => 123,
+ * )
+ * );
+ *
+ * // Render chart with the special designated renderer and default SVG driver
+ * $chart->renderer = new ezcGraphHorizontalRenderer();
+ * $chart->render( 500, 200, 'bar_chart.svg' );
+ * </code>
+ *
+ * Each chart consists of several chart elements which represents logical
+ * parts of the chart and can be formatted independently. The bar chart
+ * consists of:
+ * - title ( {@link ezcGraphChartElementText} )
+ * - legend ( {@link ezcGraphChartElementLegend} )
+ * - background ( {@link ezcGraphChartElementBackground} )
+ * - xAxis ( {@link ezcGraphChartElementLabeledAxis} )
+ * - yAxis ( {@link ezcGraphChartElementNumericAxis} )
+ *
+ * The type of the axis may be changed and all elements can be configured by
+ * accessing them as properties of the chart:
+ *
+ * <code>
+ * $chart->legend->position = ezcGraph::RIGHT;
+ * </code>
+ *
+ * The chart itself also offers several options to configure the appearance. As
+ * bar charts extend line charts the the extended configure options are
+ * available in {@link ezcGraphLineChartOptions} extending the
+ * {@link ezcGraphChartOptions}.
+ *
+ * @property ezcGraphLineChartOptions $options
+ * Chart options class
+ *
+ * @version //autogentag//
+ * @package Graph
+ * @mainclass
+ */
+class ezcGraphHorizontalBarChart extends ezcGraphBarChart
+{
+ /**
+ * Constructor
+ *
+ * @param array $options Default option array
+ * @return void
+ * @ignore
+ */
+ public function __construct( array $options = array() )
+ {
+ parent::__construct();
+
+ $this->addElement( 'xAxis', new ezcGraphChartElementNumericAxis() );
+ $this->elements['xAxis']->axisLabelRenderer = new ezcGraphAxisCenteredLabelRenderer();
+ $this->elements['xAxis']->position = ezcGraph::LEFT;
+
+ $this->addElement( 'yAxis', new ezcGraphChartElementLabeledAxis() );
+ $this->elements['yAxis']->axisLabelRenderer = new ezcGraphAxisBoxedLabelRenderer();
+ $this->elements['yAxis']->position = ezcGraph::BOTTOM;
+
+ $this->renderer = new ezcGraphHorizontalRenderer();
+ }
+
+ /**
+ * Render the assigned data
+ *
+ * Will renderer all charts data in the remaining boundings after drawing
+ * all other chart elements. The data will be rendered depending on the
+ * settings in the dataset.
+ *
+ * @param ezcGraphRenderer $renderer Renderer
+ * @param ezcGraphBoundings $boundings Remaining boundings
+ * @return void
+ */
+ protected function renderData( ezcGraphRenderer $renderer, ezcGraphBoundings $boundings, ezcGraphBoundings $innerBoundings )
+ {
+ // Use inner boundings for drawning chart data
+ $boundings = $innerBoundings;
+
+ $yAxisNullPosition = $this->elements['xAxis']->getCoordinate( false );
+
+ // Initialize counters
+ $nr = array();
+ $count = array();
+
+ foreach ( $this->data as $data )
+ {
+ if ( !isset( $nr[$data->displayType->default] ) )
+ {
+ $nr[$data->displayType->default] = 0;
+ $count[$data->displayType->default] = 0;
+ }
+
+ $nr[$data->displayType->default]++;
+ $count[$data->displayType->default]++;
+ }
+
+ $checkedRegularSteps = false;
+
+ // Display data
+ foreach ( $this->data as $datasetName => $data )
+ {
+ --$nr[$data->displayType->default];
+
+ // Check which axis should be used
+ $xAxis = ( $data->xAxis->default ? $data->xAxis->default: $this->elements['xAxis'] );
+ $yAxis = ( $data->yAxis->default ? $data->yAxis->default: $this->elements['yAxis'] );
+
+ // Determine fill color for dataset
+ if ( $this->options->fillLines !== false )
+ {
+ $fillColor = clone $data->color->default;
+ $fillColor->alpha = (int) round( ( 255 - $fillColor->alpha ) * ( $this->options->fillLines / 255 ) );
+ }
+ else
+ {
+ $fillColor = null;
+ }
+
+ // Ensure regular steps on axis when used with bar charts and
+ // precalculate some values use to render bar charts
+ //
+ // Called only once and only when bars should be rendered
+ if ( ( $checkedRegularSteps === false ) &&
+ ( $data->displayType->default === ezcGraph::BAR ) )
+ {
+ $height = $this->calculateStepWidth( $yAxis, $xAxis, $boundings->height )->y;
+ }
+
+ // Draw lines for dataset
+ $lastPoint = false;
+ foreach ( $data as $key => $value )
+ {
+ // Calculate point in chart
+ $point = $xAxis->axisLabelRenderer->modifyChartDataPosition(
+ $yAxis->axisLabelRenderer->modifyChartDataPosition(
+ new ezcGraphCoordinate(
+ $xAxis->getCoordinate( $value ),
+ $yAxis->getCoordinate( $key )
+ )
+ )
+ );
+
+ // Render depending on display type of dataset
+ switch ( true )
+ {
+ case $data->displayType->default === ezcGraph::BAR:
+ $renderer->drawHorizontalBar(
+ $boundings,
+ new ezcGraphContext( $datasetName, $key, $data->url[$key] ),
+ $data->color[$key],
+ $point,
+ $height,
+ $nr[$data->displayType->default],
+ $count[$data->displayType->default],
+ $data->symbol[$key],
+ $yAxisNullPosition
+ );
+
+ // Render highlight string if requested
+ if ( $data->highlight[$key] )
+ {
+ $renderer->drawDataHighlightText(
+ $boundings,
+ new ezcGraphContext( $datasetName, $key, $data->url[$key] ),
+ $point,
+ $yAxisNullPosition,
+ $nr[$data->displayType->default],
+ $count[$data->displayType->default],
+ $this->options->highlightFont,
+ ( $data->highlightValue[$key] ? $data->highlightValue[$key] : $value ),
+ $this->options->highlightSize + $this->options->highlightFont->padding * 2,
+ ( $this->options->highlightLines ? $data->color[$key] : null ),
+ ( $this->options->highlightXOffset ? $this->options->highlightXOffset : 0 ),
+ ( $this->options->highlightYOffset ? $this->options->highlightYOffset : 0 ),
+ $height,
+ $data->displayType->default
+ );
+ }
+ break;
+ default:
+ throw new ezcGraphInvalidDisplayTypeException( $data->displayType->default );
+ break;
+ }
+
+ // Store last point, used to connect lines in line chart.
+ $lastPoint = $point;
+ }
+ }
+ }
+
+ /**
+ * Aggregate and calculate value boundings on axis.
+ *
+ * This function is nearly the same as in ezcGraphLineChart, but reverses
+ * the usage of keys and values for the axis.
+ *
+ * @return void
+ */
+ protected function setAxisValues()
+ {
+ // Virtual data set build for agrregated values sums for bar charts
+ $virtualBarSumDataSet = array( array(), array() );
+
+ // Calculate axis scaling and labeling
+ foreach ( $this->data as $dataset )
+ {
+ $nr = 0;
+ $labels = array();
+ $values = array();
+ foreach ( $dataset as $label => $value )
+ {
+ $labels[] = $label;
+ $values[] = $value;
+
+ // Build sum of all bars
+ if ( $this->options->stackBars &&
+ ( $dataset->displayType->default === ezcGraph::BAR ) )
+ {
+ if ( !isset( $virtualBarSumDataSet[(int) $value >= 0][$nr] ) )
+ {
+ $virtualBarSumDataSet[(int) $value >= 0][$nr++] = $value;
+ }
+ else
+ {
+ $virtualBarSumDataSet[(int) $value >= 0][$nr++] += $value;
+ }
+ }
+ }
+
+ // Check if data has been associated with another custom axis, use
+ // default axis otherwise.
+ if ( $dataset->xAxis->default )
+ {
+ $dataset->xAxis->default->addData( $values );
+ }
+ else
+ {
+ $this->elements['xAxis']->addData( $values );
+ }
+
+ if ( $dataset->yAxis->default )
+ {
+ $dataset->yAxis->default->addData( array_reverse( $labels ) );
+ }
+ else
+ {
+ $this->elements['yAxis']->addData( array_reverse( $labels ) );
+ }
+ }
+
+ // There should always be something assigned to the main x and y axis.
+ if ( !$this->elements['xAxis']->initialized ||
+ !$this->elements['yAxis']->initialized )
+ {
+ throw new ezcGraphNoDataException();
+ }
+
+ // Calculate boundings from assigned data
+ $this->elements['xAxis']->calculateAxisBoundings();
+ $this->elements['yAxis']->calculateAxisBoundings();
+ }
+}
+?>
diff --git a/src/charts/line.php b/src/charts/line.php
index 3348920..4c0ba14 100644
--- a/src/charts/line.php
+++ b/src/charts/line.php
@@ -174,6 +174,47 @@ class ezcGraphLineChart extends ezcGraphChart
}
/**
+ * Calculate bar chart step width
+ *
+ * @return void
+ */
+ protected function calculateStepWidth( ezcGraphChartElementAxis $mainAxis, ezcGraphChartElementAxis $secondAxis, $width )
+ {
+ $steps = $mainAxis->getSteps();
+
+ $stepWidth = null;
+ foreach ( $steps as $step )
+ {
+ if ( $stepWidth === null )
+ {
+ $stepWidth = $step->width;
+ }
+ elseif ( $step->width !== $stepWidth )
+ {
+ throw new ezcGraphUnregularStepsException();
+ }
+ }
+
+ $step = reset( $steps );
+ if ( count( $step->childs ) )
+ {
+ // Keep this for BC reasons
+ $barCount = ( $mainAxis->getMajorStepCount() + 1 ) * ( $mainAxis->getMinorStepCount() - 1 );
+ $stepWidth = 1 / $barCount;
+ }
+
+ $checkedRegularSteps = true;
+ return $mainAxis->axisLabelRenderer->modifyChartDataPosition(
+ $secondAxis->axisLabelRenderer->modifyChartDataPosition(
+ new ezcGraphCoordinate(
+ $width * $stepWidth,
+ $width * $stepWidth
+ )
+ )
+ );
+ }
+
+ /**
* Render the assigned data
*
* Will renderer all charts data in the remaining boundings after drawing
@@ -236,38 +277,7 @@ class ezcGraphLineChart extends ezcGraphChart
if ( ( $checkedRegularSteps === false ) &&
( $data->displayType->default === ezcGraph::BAR ) )
{
- $steps = $xAxis->getSteps();
-
- $stepWidth = null;
- foreach ( $steps as $step )
- {
- if ( $stepWidth === null )
- {
- $stepWidth = $step->width;
- }
- elseif ( $step->width !== $stepWidth )
- {
- throw new ezcGraphUnregularStepsException();
- }
- }
-
- $step = reset( $steps );
- if ( count( $step->childs ) )
- {
- // Keep this for BC reasons
- $barCount = ( $xAxis->getMajorStepCount() + 1 ) * ( $xAxis->getMinorStepCount() - 1 );
- $stepWidth = 1 / $barCount;
- }
-
- $checkedRegularSteps = true;
- $width = $xAxis->axisLabelRenderer->modifyChartDataPosition(
- $yAxis->axisLabelRenderer->modifyChartDataPosition(
- new ezcGraphCoordinate(
- ( $boundings->x1 - $boundings->x0 ) * $stepWidth,
- 0
- )
- )
- )->x;
+ $width = $this->calculateStepWidth( $xAxis, $yAxis, $boundings->width )->x;
}
// Draw lines for dataset
diff --git a/src/graph_autoload.php b/src/graph_autoload.php
index d1e2e61..c66e1a2 100644
--- a/src/graph_autoload.php
+++ b/src/graph_autoload.php
@@ -40,8 +40,14 @@ return array(
'ezcGraphChart' => 'Graph/interfaces/chart.php',
'ezcGraphChartElement' => 'Graph/interfaces/element.php',
'ezcGraphChartOptions' => 'Graph/options/chart.php',
+ 'ezcGraphLineChart' => 'Graph/charts/line.php',
'ezcGraphMatrix' => 'Graph/math/matrix.php',
+ 'ezcGraphOdometerRenderer' => 'Graph/interfaces/odometer_renderer.php',
+ 'ezcGraphRadarRenderer' => 'Graph/interfaces/radar_renderer.php',
+ 'ezcGraphRenderer' => 'Graph/interfaces/renderer.php',
+ 'ezcGraphStackedBarsRenderer' => 'Graph/interfaces/stacked_bar_renderer.php',
'ezcGraphAxisLabelRenderer' => 'Graph/interfaces/axis_label_renderer.php',
+ 'ezcGraphBarChart' => 'Graph/charts/bar.php',
'ezcGraphChartDataContainer' => 'Graph/data_container/base.php',
'ezcGraphChartElementAxis' => 'Graph/element/axis.php',
'ezcGraphColor' => 'Graph/colors/color.php',
@@ -50,13 +56,10 @@ return array(
'ezcGraphDataSetProperty' => 'Graph/interfaces/dataset_property.php',
'ezcGraphDriver' => 'Graph/interfaces/driver.php',
'ezcGraphDriverOptions' => 'Graph/options/driver.php',
- 'ezcGraphLineChart' => 'Graph/charts/line.php',
- 'ezcGraphOdometerRenderer' => 'Graph/interfaces/odometer_renderer.php',
+ 'ezcGraphHorizontalBarRenderer' => 'Graph/interfaces/horizontal_bar_renderer.php',
'ezcGraphPalette' => 'Graph/interfaces/palette.php',
- 'ezcGraphRadarRenderer' => 'Graph/interfaces/radar_renderer.php',
- 'ezcGraphRenderer' => 'Graph/interfaces/renderer.php',
+ 'ezcGraphRenderer2d' => 'Graph/renderer/2d.php',
'ezcGraphRendererOptions' => 'Graph/options/renderer.php',
- 'ezcGraphStackedBarsRenderer' => 'Graph/interfaces/stacked_bar_renderer.php',
'ezcGraphTransformation' => 'Graph/math/transformation.php',
'ezcGraph' => 'Graph/graph.php',
'ezcGraphArrayDataSet' => 'Graph/datasets/array.php',
@@ -68,7 +71,6 @@ return array(
'ezcGraphAxisRadarLabelRenderer' => 'Graph/renderer/axis_label_radar.php',
'ezcGraphAxisRotatedLabelRenderer' => 'Graph/renderer/axis_label_rotated.php',
'ezcGraphAxisStep' => 'Graph/structs/step.php',
- 'ezcGraphBarChart' => 'Graph/charts/bar.php',
'ezcGraphBoundings' => 'Graph/math/boundings.php',
'ezcGraphCairoDriver' => 'Graph/driver/cairo.php',
'ezcGraphCairoDriverOptions' => 'Graph/options/cairo_driver.php',
@@ -92,6 +94,8 @@ return array(
'ezcGraphFontOptions' => 'Graph/options/font.php',
'ezcGraphGdDriver' => 'Graph/driver/gd.php',
'ezcGraphGdDriverOptions' => 'Graph/options/gd_driver.php',
+ 'ezcGraphHorizontalBarChart' => 'Graph/charts/horizontal_bar.php',
+ 'ezcGraphHorizontalRenderer' => 'Graph/renderer/horizontal_bar.php',
'ezcGraphLineChartOptions' => 'Graph/options/line_chart.php',
'ezcGraphLinearGradient' => 'Graph/colors/linear_gradient.php',
'ezcGraphNumericDataSet' => 'Graph/datasets/numeric.php',
@@ -109,7 +113,6 @@ return array(
'ezcGraphRadarChart' => 'Graph/charts/radar.php',
'ezcGraphRadarChartOptions' => 'Graph/options/radar_chart.php',
'ezcGraphRadialGradient' => 'Graph/colors/radial_gradient.php',
- 'ezcGraphRenderer2d' => 'Graph/renderer/2d.php',
'ezcGraphRenderer2dOptions' => 'Graph/options/renderer_2d.php',
'ezcGraphRenderer3d' => 'Graph/renderer/3d.php',
'ezcGraphRenderer3dOptions' => 'Graph/options/renderer_3d.php',
diff --git a/src/interfaces/horizontal_bar_renderer.php b/src/interfaces/horizontal_bar_renderer.php
new file mode 100644
index 0000000..e6e937f
--- /dev/null
+++ b/src/interfaces/horizontal_bar_renderer.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * File containing the ezcGraphHorizontalBarRenderer interface
+ *
+ * @package Graph
+ * @version //autogentag//
+ * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+/**
+ * Interface which adds the methods reqired to render horizontal bar charts to
+ * the renderer.
+ *
+ * @version //autogentag//
+ * @package Graph
+ */
+interface ezcGraphHorizontalBarRenderer
+{
+ /**
+ * Draw horizontal bar
+ *
+ * Draws a horizontal bar as a data element in a line chart
+ *
+ * @param ezcGraphBoundings $boundings Chart boundings
+ * @param ezcGraphContext $context Context of call
+ * @param ezcGraphColor $color Color of line
+ * @param ezcGraphCoordinate $position Position of data point
+ * @param float $stepSize Space which can be used for bars
+ * @param int $dataNumber Number of dataset
+ * @param int $dataCount Count of datasets in chart
+ * @param int $symbol Symbol to draw for line
+ * @param float $axisPosition Position of axis for drawing filled lines
+ * @return void
+ */
+ public function drawHorizontalBar(
+ ezcGraphBoundings $boundings,
+ ezcGraphContext $context,
+ ezcGraphColor $color,
+ ezcGraphCoordinate $position,
+ $stepSize,
+ $dataNumber = 1,
+ $dataCount = 1,
+ $symbol = ezcGraph::NO_SYMBOL,
+ $axisPosition = 0.
+ );
+}
+
+?>
diff --git a/src/renderer/horizontal_bar.php b/src/renderer/horizontal_bar.php
new file mode 100644
index 0000000..7448741
--- /dev/null
+++ b/src/renderer/horizontal_bar.php
@@ -0,0 +1,177 @@
+<?php
+/**
+ * File containing the two dimensional renderer
+ *
+ * @package Graph
+ * @version //autogentag//
+ * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+/**
+ * Class to transform horizontal bar charts primitives into image primitives.
+ * Renders charts in a two dimensional view.
+ *
+ * The class options are defined in the class {@link ezcGraphRenderer2dOptions}
+ * extending the basic renderer options in {@link ezcGraphRendererOptions}.
+ *
+ * <code>
+ * @TODO: Add example
+ * </code>
+ *
+ * @version //autogentag//
+ * @package Graph
+ * @mainclass
+ */
+class ezcGraphHorizontalRenderer
+ extends
+ ezcGraphRenderer2d
+ implements
+ ezcGraphHorizontalBarRenderer
+{
+ /**
+ * Draw horizontal bar
+ *
+ * Draws a horizontal bar as a data element in a line chart
+ *
+ * @param ezcGraphBoundings $boundings Chart boundings
+ * @param ezcGraphContext $context Context of call
+ * @param ezcGraphColor $color Color of line
+ * @param ezcGraphCoordinate $position Position of data point
+ * @param float $stepSize Space which can be used for bars
+ * @param int $dataNumber Number of dataset
+ * @param int $dataCount Count of datasets in chart
+ * @param int $symbol Symbol to draw for line
+ * @param float $axisPosition Position of axis for drawing filled lines
+ * @return void
+ */
+ public function drawHorizontalBar(
+ ezcGraphBoundings $boundings,
+ ezcGraphContext $context,
+ ezcGraphColor $color,
+ ezcGraphCoordinate $position,
+ $stepSize,
+ $dataNumber = 1,
+ $dataCount = 1,
+ $symbol = ezcGraph::NO_SYMBOL,
+ $axisPosition = 0. )
+ {
+ // Apply margin
+ $margin = $stepSize * $this->options->barMargin;
+ $padding = $stepSize * $this->options->barPadding;
+ $barHeight = ( $stepSize - $margin ) / $dataCount - $padding;
+ $offset = - $stepSize / 2 + $margin / 2 + ( $dataCount - $dataNumber - 1 ) * ( $padding + $barHeight ) + $padding / 2;
+
+ $barPointArray = array(
+ new ezcGraphCoordinate(
+ $boundings->x0 + ( $boundings->width ) * $axisPosition,
+ $boundings->y0 + ( $boundings->height ) * $position->y + $offset
+ ),
+ new ezcGraphCoordinate(
+ $boundings->x0 + ( $boundings->width ) * $position->x,
+ $boundings->y0 + ( $boundings->height ) * $position->y + $offset
+ ),
+ new ezcGraphCoordinate(
+ $boundings->x0 + ( $boundings->width ) * $position->x,
+ $boundings->y0 + ( $boundings->height ) * $position->y + $offset + $barHeight
+ ),
+ new ezcGraphCoordinate(
+ $boundings->x0 + ( $boundings->width ) * $axisPosition,
+ $boundings->y0 + ( $boundings->height ) * $position->y + $offset + $barHeight
+ ),
+ );
+
+ $this->addElementReference(
+ $context,
+ $this->driver->drawPolygon(
+ $barPointArray,
+ $color,
+ true
+ )
+ );
+
+ if ( $this->options->dataBorder > 0 )
+ {
+ $darkened = $color->darken( $this->options->dataBorder );
+ $this->driver->drawPolygon(
+ $barPointArray,
+ $darkened,
+ false,
+ 1
+ );
+ }
+ }
+
+ /**
+ * Draw bar
+ *
+ * Draws a bar as a data element in a line chart
+ *
+ * @param ezcGraphBoundings $boundings Chart boundings
+ * @param ezcGraphContext $context Context of call
+ * @param ezcGraphColor $color Color of line
+ * @param ezcGraphCoordinate $position Position of data point
+ * @param float $stepSize Space which can be used for bars
+ * @param int $dataNumber Number of dataset
+ * @param int $dataCount Count of datasets in chart
+ * @param int $symbol Symbol to draw for line
+ * @param float $axisPosition Position of axis for drawing filled lines
+ * @return void
+ */
+ public function drawBar(
+ ezcGraphBoundings $boundings,
+ ezcGraphContext $context,
+ ezcGraphColor $color,
+ ezcGraphCoordinate $position,
+ $stepSize,
+ $dataNumber = 1,
+ $dataCount = 1,
+ $symbol = ezcGraph::NO_SYMBOL,
+ $axisPosition = 0. )
+ {
+ throw new ezcBaseFunctionalityNotSupportedException(
+ "A normal bar chart",
+ "Only horizontal bar charts can be renderered with the ezcGraphHorizontalRenderer"
+ );
+ }
+
+ /**
+ * Draw data line
+ *
+ * Draws a line as a data element in a line chart
+ *
+ * @param ezcGraphBoundings $boundings Chart boundings
+ * @param ezcGraphContext $context Context of call
+ * @param ezcGraphColor $color Color of line
+ * @param ezcGraphCoordinate $start Starting point
+ * @param ezcGraphCoordinate $end Ending point
+ * @param int $dataNumber Number of dataset
+ * @param int $dataCount Count of datasets in chart
+ * @param int $symbol Symbol to draw for line
+ * @param ezcGraphColor $symbolColor Color of the symbol, defaults to linecolor
+ * @param ezcGraphColor $fillColor Color to fill line with
+ * @param float $axisPosition Position of axis for drawing filled lines
+ * @param float $thickness Line thickness
+ * @return void
+ */
+ public function drawDataLine(
+ ezcGraphBoundings $boundings,
+ ezcGraphContext $context,
+ ezcGraphColor $color,
+ ezcGraphCoordinate $start,
+ ezcGraphCoordinate $end,
+ $dataNumber = 1,
+ $dataCount = 1,
+ $symbol = ezcGraph::NO_SYMBOL,
+ ezcGraphColor $symbolColor = null,
+ ezcGraphColor $fillColor = null,
+ $axisPosition = 0.,
+ $thickness = 1. )
+ {
+ throw new ezcBaseFunctionalityNotSupportedException(
+ "A normal line chart",
+ "Only horizontal bar charts can be renderered with the ezcGraphHorizontalRenderer"
+ );
+ }
+}
+
+?>
diff --git a/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderBasicHorizontalBarChart.svg b/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderBasicHorizontalBarChart.svg
new file mode 100644
index 0000000..ef3b7c3
--- /dev/null
+++ b/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderBasicHorizontalBarChart.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="200" version="1.0" id="ezcGraph"><defs/><g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"><path d=" M 0.0000,200.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,200.0000 L 0.0000,200.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"/><path d=" M 0.0000,200.0000 L 0.0000,0.0000 L 100.0000,0.0000 L 100.0000,200.0000 L 0.0000,200.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"/><path d=" M 2.0000,16.0000 L 2.0000,2.0000 L 16.0000,2.0000 L 16.0000,16.0000 L 2.0000,16.0000 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_3"/><path d=" M 100.0000,180.0000 L 500.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_5"/><path d=" M 492.0000,176.0000 L 500.0000,180.0000 L 492.0000,184.0000 L 492.0000,176.0000 z " style="fill: #2e3436; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_6"/><path d=" M 160.0000,20.0000 L 160.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_7"/><path d=" M 160.0000,179.0000 L 160.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_8"/><path d=" M 180.0000,20.0000 L 180.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_9"/><path d=" M 180.0000,179.0000 L 180.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_10"/><path d=" M 200.0000,20.0000 L 200.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_11"/><path d=" M 200.0000,179.0000 L 200.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_12"/><path d=" M 220.0000,20.0000 L 220.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_13"/><path d=" M 220.0000,177.0000 L 220.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_14"/><path d=" M 240.0000,20.0000 L 240.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_16"/><path d=" M 240.0000,179.0000 L 240.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_17"/><path d=" M 260.0000,20.0000 L 260.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_18"/><path d=" M 260.0000,179.0000 L 260.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_19"/><path d=" M 280.0000,20.0000 L 280.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_20"/><path d=" M 280.0000,179.0000 L 280.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_21"/><path d=" M 300.0000,20.0000 L 300.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_22"/><path d=" M 300.0000,177.0000 L 300.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_23"/><path d=" M 320.0000,20.0000 L 320.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_25"/><path d=" M 320.0000,179.0000 L 320.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_26"/><path d=" M 340.0000,20.0000 L 340.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_27"/><path d=" M 340.0000,179.0000 L 340.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_28"/><path d=" M 360.0000,20.0000 L 360.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_29"/><path d=" M 360.0000,179.0000 L 360.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_30"/><path d=" M 380.0000,20.0000 L 380.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_31"/><path d=" M 380.0000,177.0000 L 380.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_32"/><path d=" M 400.0000,20.0000 L 400.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_34"/><path d=" M 400.0000,179.0000 L 400.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_35"/><path d=" M 420.0000,20.0000 L 420.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_36"/><path d=" M 420.0000,179.0000 L 420.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_37"/><path d=" M 440.0000,20.0000 L 440.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_38"/><path d=" M 440.0000,179.0000 L 440.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_39"/><path d=" M 460.0000,20.0000 L 460.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_40"/><path d=" M 460.0000,177.0000 L 460.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_41"/><path d=" M 140.0000,200.0000 L 140.0000,0.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_43"/><path d=" M 137.5000,5.0000 L 140.0000,0.0000 L 142.5000,5.0000 L 137.5000,5.0000 z " style="fill: #2e3436; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_44"/><path d=" M 140.0000,148.0000 L 460.0000,148.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_46"/><path d=" M 137.0000,148.0000 L 143.0000,148.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_47"/><path d=" M 140.0000,116.0000 L 460.0000,116.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_49"/><path d=" M 137.0000,116.0000 L 143.0000,116.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_50"/><path d=" M 140.0000,84.0000 L 460.0000,84.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_52"/><path d=" M 137.0000,84.0000 L 143.0000,84.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_53"/><path d=" M 140.0000,52.0000 L 460.0000,52.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_55"/><path d=" M 137.0000,52.0000 L 143.0000,52.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_56"/><path d=" M 140.0000,20.0000 L 460.0000,20.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_58"/><path d=" M 137.0000,20.0000 L 143.0000,20.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_59"/><path d=" M 140.0000,49.6425 L 140.0000,22.3575 L 327.2000,22.3575 L 327.2000,49.6425 L 140.0000,49.6425 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_60"/><path d=" M 140.5000,22.8575 L 326.7000,22.8575 L 326.7000,49.1425 L 140.5000,49.1425 L 140.5000,22.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_61"/><path d=" M 140.0000,81.6425 L 140.0000,54.3575 L 260.8000,54.3575 L 260.8000,81.6425 L 140.0000,81.6425 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_62"/><path d=" M 140.5000,54.8575 L 260.3000,54.8575 L 260.3000,81.1425 L 140.5000,81.1425 L 140.5000,54.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_63"/><path d=" M 140.0000,113.6425 L 140.0000,86.3575 L 399.2000,86.3575 L 399.2000,113.6425 L 140.0000,113.6425 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_64"/><path d=" M 140.5000,86.8575 L 398.7000,86.8575 L 398.7000,113.1425 L 140.5000,113.1425 L 140.5000,86.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_65"/><path d=" M 140.0000,145.6425 L 140.0000,118.3575 L 236.0000,118.3575 L 236.0000,145.6425 L 140.0000,145.6425 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_66"/><path d=" M 140.5000,118.8575 L 235.5000,118.8575 L 235.5000,145.1425 L 140.5000,145.1425 L 140.5000,118.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_67"/><path d=" M 140.0000,177.6425 L 140.0000,150.3575 L 140.8000,150.3575 L 140.8000,177.6425 L 140.0000,177.6425 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_68"/><path d=" M 140.5000,150.8575 L 140.3000,150.8575 L 140.3000,177.1425 L 140.5000,177.1425 L 140.5000,150.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_69"/><g id="ezcGraphTextBox_4"><path d=" M 16.5000,17.0000 L 16.5000,1.5000 L 55.1000,1.5000 L 55.1000,17.0000 L 16.5000,17.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_70"/><text id="ezcGraphTextBox_4_text" x="17.0000" text-length="37.1000px" y="13.9000" style="font-size: 14px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">Set 1</text></g><g id="ezcGraphTextBox_15"><path d=" M 209.2700,194.0000 L 209.2700,181.5000 L 231.2300,181.5000 L 231.2300,194.0000 L 209.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_71"/><text id="ezcGraphTextBox_15_text" x="209.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">100</text></g><g id="ezcGraphTextBox_24"><path d=" M 289.2700,194.0000 L 289.2700,181.5000 L 311.2300,181.5000 L 311.2300,194.0000 L 289.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_72"/><text id="ezcGraphTextBox_24_text" x="289.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">200</text></g><g id="ezcGraphTextBox_33"><path d=" M 369.2700,194.0000 L 369.2700,181.5000 L 391.2300,181.5000 L 391.2300,194.0000 L 369.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_73"/><text id="ezcGraphTextBox_33_text" x="369.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">300</text></g><g id="ezcGraphTextBox_42"><path d=" M 449.2700,194.0000 L 449.2700,181.5000 L 471.2300,181.5000 L 471.2300,194.0000 L 449.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_74"/><text id="ezcGraphTextBox_42_text" x="449.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">400</text></g><g id="ezcGraphTextBox_45"><path d=" M 102.5200,176.0500 L 102.5200,152.4500 L 139.0000,152.4500 L 139.0000,176.0500 L 102.5200,176.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_75"/><text id="ezcGraphTextBox_45_text" x="103.0200" text-length="34.9800px" y="162.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_45_text" x="131.1800" text-length="6.8200px" y="174.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">5</text></g><g id="ezcGraphTextBox_48"><path d=" M 102.5200,144.0500 L 102.5200,120.4500 L 139.0000,120.4500 L 139.0000,144.0500 L 102.5200,144.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_76"/><text id="ezcGraphTextBox_48_text" x="103.0200" text-length="34.9800px" y="130.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_48_text" x="131.1800" text-length="6.8200px" y="142.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">4</text></g><g id="ezcGraphTextBox_51"><path d=" M 102.5200,112.0500 L 102.5200,88.4500 L 139.0000,88.4500 L 139.0000,112.0500 L 102.5200,112.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_77"/><text id="ezcGraphTextBox_51_text" x="103.0200" text-length="34.9800px" y="98.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_51_text" x="131.1800" text-length="6.8200px" y="110.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">3</text></g><g id="ezcGraphTextBox_54"><path d=" M 102.5200,80.0500 L 102.5200,56.4500 L 139.0000,56.4500 L 139.0000,80.0500 L 102.5200,80.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_78"/><text id="ezcGraphTextBox_54_text" x="103.0200" text-length="34.9800px" y="66.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_54_text" x="131.1800" text-length="6.8200px" y="78.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">2</text></g><g id="ezcGraphTextBox_57"><path d=" M 102.5200,48.0500 L 102.5200,24.4500 L 139.0000,24.4500 L 139.0000,48.0500 L 102.5200,48.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_79"/><text id="ezcGraphTextBox_57_text" x="103.0200" text-length="34.9800px" y="34.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_57_text" x="131.1800" text-length="6.8200px" y="46.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">1</text></g></g></svg>
diff --git a/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartMultipleBars.svg b/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartMultipleBars.svg
new file mode 100644
index 0000000..38465f8
--- /dev/null
+++ b/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartMultipleBars.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="200" version="1.0" id="ezcGraph"><defs/><g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"><path d=" M 0.0000,200.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,200.0000 L 0.0000,200.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"/><path d=" M 0.0000,200.0000 L 0.0000,0.0000 L 100.0000,0.0000 L 100.0000,200.0000 L 0.0000,200.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"/><path d=" M 2.0000,16.0000 L 2.0000,2.0000 L 16.0000,2.0000 L 16.0000,16.0000 L 2.0000,16.0000 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_3"/><path d=" M 2.0000,34.0000 L 2.0000,20.0000 L 16.0000,20.0000 L 16.0000,34.0000 L 2.0000,34.0000 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_5"/><path d=" M 100.0000,180.0000 L 500.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_7"/><path d=" M 492.0000,176.0000 L 500.0000,180.0000 L 492.0000,184.0000 L 492.0000,176.0000 z " style="fill: #2e3436; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_8"/><path d=" M 161.3333,20.0000 L 161.3333,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_9"/><path d=" M 161.3333,179.0000 L 161.3333,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_10"/><path d=" M 182.6667,20.0000 L 182.6667,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_11"/><path d=" M 182.6667,179.0000 L 182.6667,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_12"/><path d=" M 204.0000,20.0000 L 204.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_13"/><path d=" M 204.0000,179.0000 L 204.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_14"/><path d=" M 225.3333,20.0000 L 225.3333,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_15"/><path d=" M 225.3333,179.0000 L 225.3333,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_16"/><path d=" M 246.6667,20.0000 L 246.6667,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_17"/><path d=" M 246.6667,177.0000 L 246.6667,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_18"/><path d=" M 268.0000,20.0000 L 268.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_20"/><path d=" M 268.0000,179.0000 L 268.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_21"/><path d=" M 289.3333,20.0000 L 289.3333,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_22"/><path d=" M 289.3333,179.0000 L 289.3333,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_23"/><path d=" M 310.6667,20.0000 L 310.6667,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_24"/><path d=" M 310.6667,179.0000 L 310.6667,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_25"/><path d=" M 332.0000,20.0000 L 332.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_26"/><path d=" M 332.0000,179.0000 L 332.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_27"/><path d=" M 353.3333,20.0000 L 353.3333,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_28"/><path d=" M 353.3333,177.0000 L 353.3333,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_29"/><path d=" M 374.6667,20.0000 L 374.6667,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_31"/><path d=" M 374.6667,179.0000 L 374.6667,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_32"/><path d=" M 396.0000,20.0000 L 396.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_33"/><path d=" M 396.0000,179.0000 L 396.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_34"/><path d=" M 417.3333,20.0000 L 417.3333,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_35"/><path d=" M 417.3333,179.0000 L 417.3333,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_36"/><path d=" M 438.6667,20.0000 L 438.6667,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_37"/><path d=" M 438.6667,179.0000 L 438.6667,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_38"/><path d=" M 460.0000,20.0000 L 460.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_39"/><path d=" M 460.0000,177.0000 L 460.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_40"/><path d=" M 140.0000,200.0000 L 140.0000,0.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_42"/><path d=" M 137.5000,5.0000 L 140.0000,0.0000 L 142.5000,5.0000 L 137.5000,5.0000 z " style="fill: #2e3436; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_43"/><path d=" M 140.0000,148.0000 L 460.0000,148.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_45"/><path d=" M 137.0000,148.0000 L 143.0000,148.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_46"/><path d=" M 140.0000,116.0000 L 460.0000,116.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_48"/><path d=" M 137.0000,116.0000 L 143.0000,116.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_49"/><path d=" M 140.0000,84.0000 L 460.0000,84.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_51"/><path d=" M 137.0000,84.0000 L 143.0000,84.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_52"/><path d=" M 140.0000,52.0000 L 460.0000,52.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_54"/><path d=" M 137.0000,52.0000 L 143.0000,52.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_55"/><path d=" M 140.0000,20.0000 L 460.0000,20.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_57"/><path d=" M 137.0000,20.0000 L 143.0000,20.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_58"/><path d=" M 140.0000,35.1975 L 140.0000,22.3575 L 239.8400,22.3575 L 239.8400,35.1975 L 140.0000,35.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_59"/><path d=" M 140.5000,22.8575 L 239.3400,22.8575 L 239.3400,34.6975 L 140.5000,34.6975 L 140.5000,22.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_60"/><path d=" M 140.0000,67.1975 L 140.0000,54.3575 L 204.4267,54.3575 L 204.4267,67.1975 L 140.0000,67.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_61"/><path d=" M 140.5000,54.8575 L 203.9267,54.8575 L 203.9267,66.6975 L 140.5000,66.6975 L 140.5000,54.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_62"/><path d=" M 140.0000,99.1975 L 140.0000,86.3575 L 278.2400,86.3575 L 278.2400,99.1975 L 140.0000,99.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_63"/><path d=" M 140.5000,86.8575 L 277.7400,86.8575 L 277.7400,98.6975 L 140.5000,98.6975 L 140.5000,86.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_64"/><path d=" M 140.0000,131.1975 L 140.0000,118.3575 L 191.2000,118.3575 L 191.2000,131.1975 L 140.0000,131.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_65"/><path d=" M 140.5000,118.8575 L 190.7000,118.8575 L 190.7000,130.6975 L 140.5000,130.6975 L 140.5000,118.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_66"/><path d=" M 140.0000,163.1975 L 140.0000,150.3575 L 140.4267,150.3575 L 140.4267,163.1975 L 140.0000,163.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_67"/><path d=" M 140.0000,49.6425 L 140.0000,36.8025 L 371.6800,36.8025 L 371.6800,49.6425 L 140.0000,49.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_68"/><path d=" M 140.5000,37.3025 L 371.1800,37.3025 L 371.1800,49.1425 L 140.5000,49.1425 L 140.5000,37.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_69"/><path d=" M 140.0000,81.6425 L 140.0000,68.8025 L 239.8400,68.8025 L 239.8400,81.6425 L 140.0000,81.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_70"/><path d=" M 140.5000,69.3025 L 239.3400,69.3025 L 239.3400,81.1425 L 140.5000,81.1425 L 140.5000,69.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_71"/><path d=" M 140.0000,113.6425 L 140.0000,100.8025 L 267.1467,100.8025 L 267.1467,113.6425 L 140.0000,113.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_72"/><path d=" M 140.5000,101.3025 L 266.6467,101.3025 L 266.6467,113.1425 L 140.5000,113.1425 L 140.5000,101.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_73"/><path d=" M 140.0000,145.6425 L 140.0000,132.8025 L 142.1333,132.8025 L 142.1333,145.6425 L 140.0000,145.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_74"/><path d=" M 140.5000,133.3025 L 141.6333,133.3025 L 141.6333,145.1425 L 140.5000,145.1425 L 140.5000,133.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_75"/><path d=" M 140.0000,177.6425 L 140.0000,164.8025 L 192.9067,164.8025 L 192.9067,177.6425 L 140.0000,177.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_76"/><path d=" M 140.5000,165.3025 L 192.4067,165.3025 L 192.4067,177.1425 L 140.5000,177.1425 L 140.5000,165.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_77"/><g id="ezcGraphTextBox_4"><path d=" M 16.5000,17.0000 L 16.5000,1.5000 L 55.1000,1.5000 L 55.1000,17.0000 L 16.5000,17.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_78"/><text id="ezcGraphTextBox_4_text" x="17.0000" text-length="37.1000px" y="13.9000" style="font-size: 14px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">Set 1</text></g><g id="ezcGraphTextBox_6"><path d=" M 16.5000,35.0000 L 16.5000,19.5000 L 55.1000,19.5000 L 55.1000,35.0000 L 16.5000,35.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_79"/><text id="ezcGraphTextBox_6_text" x="17.0000" text-length="37.1000px" y="31.9000" style="font-size: 14px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">Set 2</text></g><g id="ezcGraphTextBox_19"><path d=" M 235.9367,194.0000 L 235.9367,181.5000 L 257.8967,181.5000 L 257.8967,194.0000 L 235.9367,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_80"/><text id="ezcGraphTextBox_19_text" x="236.4367" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">250</text></g><g id="ezcGraphTextBox_30"><path d=" M 342.6033,194.0000 L 342.6033,181.5000 L 364.5633,181.5000 L 364.5633,194.0000 L 342.6033,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_81"/><text id="ezcGraphTextBox_30_text" x="343.1033" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">500</text></g><g id="ezcGraphTextBox_41"><path d=" M 449.2700,194.0000 L 449.2700,181.5000 L 471.2300,181.5000 L 471.2300,194.0000 L 449.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_82"/><text id="ezcGraphTextBox_41_text" x="449.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">750</text></g><g id="ezcGraphTextBox_44"><path d=" M 102.5200,176.0500 L 102.5200,152.4500 L 139.0000,152.4500 L 139.0000,176.0500 L 102.5200,176.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_83"/><text id="ezcGraphTextBox_44_text" x="103.0200" text-length="34.9800px" y="162.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_44_text" x="131.1800" text-length="6.8200px" y="174.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">5</text></g><g id="ezcGraphTextBox_47"><path d=" M 102.5200,144.0500 L 102.5200,120.4500 L 139.0000,120.4500 L 139.0000,144.0500 L 102.5200,144.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_84"/><text id="ezcGraphTextBox_47_text" x="103.0200" text-length="34.9800px" y="130.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_47_text" x="131.1800" text-length="6.8200px" y="142.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">4</text></g><g id="ezcGraphTextBox_50"><path d=" M 102.5200,112.0500 L 102.5200,88.4500 L 139.0000,88.4500 L 139.0000,112.0500 L 102.5200,112.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_85"/><text id="ezcGraphTextBox_50_text" x="103.0200" text-length="34.9800px" y="98.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_50_text" x="131.1800" text-length="6.8200px" y="110.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">3</text></g><g id="ezcGraphTextBox_53"><path d=" M 102.5200,80.0500 L 102.5200,56.4500 L 139.0000,56.4500 L 139.0000,80.0500 L 102.5200,80.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_86"/><text id="ezcGraphTextBox_53_text" x="103.0200" text-length="34.9800px" y="66.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_53_text" x="131.1800" text-length="6.8200px" y="78.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">2</text></g><g id="ezcGraphTextBox_56"><path d=" M 102.5200,48.0500 L 102.5200,24.4500 L 139.0000,24.4500 L 139.0000,48.0500 L 102.5200,48.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_87"/><text id="ezcGraphTextBox_56_text" x="103.0200" text-length="34.9800px" y="34.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_56_text" x="131.1800" text-length="6.8200px" y="46.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">1</text></g></g></svg>
diff --git a/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartNegativeValues.svg b/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartNegativeValues.svg
new file mode 100644
index 0000000..8101a82
--- /dev/null
+++ b/tests/data/compare/ezcGraphHorizontalBarRendererTests_testRenderHorizontalBarChartNegativeValues.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="200" version="1.0" id="ezcGraph"><defs/><g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"><path d=" M 0.0000,200.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,200.0000 L 0.0000,200.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"/><path d=" M 0.0000,200.0000 L 0.0000,0.0000 L 100.0000,0.0000 L 100.0000,200.0000 L 0.0000,200.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"/><path d=" M 2.0000,16.0000 L 2.0000,2.0000 L 16.0000,2.0000 L 16.0000,16.0000 L 2.0000,16.0000 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_3"/><path d=" M 2.0000,34.0000 L 2.0000,20.0000 L 16.0000,20.0000 L 16.0000,34.0000 L 2.0000,34.0000 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_5"/><path d=" M 100.0000,180.0000 L 500.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_7"/><path d=" M 492.0000,176.0000 L 500.0000,180.0000 L 492.0000,184.0000 L 492.0000,176.0000 z " style="fill: #2e3436; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_8"/><path d=" M 140.0000,20.0000 L 140.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_9"/><path d=" M 140.0000,177.0000 L 140.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_10"/><path d=" M 152.8000,20.0000 L 152.8000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_12"/><path d=" M 152.8000,179.0000 L 152.8000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_13"/><path d=" M 165.6000,20.0000 L 165.6000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_14"/><path d=" M 165.6000,179.0000 L 165.6000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_15"/><path d=" M 178.4000,20.0000 L 178.4000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_16"/><path d=" M 178.4000,179.0000 L 178.4000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_17"/><path d=" M 191.2000,20.0000 L 191.2000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_18"/><path d=" M 191.2000,179.0000 L 191.2000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_19"/><path d=" M 204.0000,20.0000 L 204.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_20"/><path d=" M 204.0000,177.0000 L 204.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_21"/><path d=" M 216.8000,20.0000 L 216.8000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_23"/><path d=" M 216.8000,179.0000 L 216.8000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_24"/><path d=" M 229.6000,20.0000 L 229.6000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_25"/><path d=" M 229.6000,179.0000 L 229.6000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_26"/><path d=" M 242.4000,20.0000 L 242.4000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_27"/><path d=" M 242.4000,179.0000 L 242.4000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_28"/><path d=" M 255.2000,20.0000 L 255.2000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_29"/><path d=" M 255.2000,179.0000 L 255.2000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_30"/><path d=" M 280.8000,20.0000 L 280.8000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_31"/><path d=" M 280.8000,179.0000 L 280.8000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_32"/><path d=" M 293.6000,20.0000 L 293.6000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_33"/><path d=" M 293.6000,179.0000 L 293.6000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_34"/><path d=" M 306.4000,20.0000 L 306.4000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_35"/><path d=" M 306.4000,179.0000 L 306.4000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_36"/><path d=" M 319.2000,20.0000 L 319.2000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_37"/><path d=" M 319.2000,179.0000 L 319.2000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_38"/><path d=" M 332.0000,20.0000 L 332.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_39"/><path d=" M 332.0000,177.0000 L 332.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_40"/><path d=" M 344.8000,20.0000 L 344.8000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_42"/><path d=" M 344.8000,179.0000 L 344.8000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_43"/><path d=" M 357.6000,20.0000 L 357.6000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_44"/><path d=" M 357.6000,179.0000 L 357.6000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_45"/><path d=" M 370.4000,20.0000 L 370.4000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_46"/><path d=" M 370.4000,179.0000 L 370.4000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_47"/><path d=" M 383.2000,20.0000 L 383.2000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_48"/><path d=" M 383.2000,179.0000 L 383.2000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_49"/><path d=" M 396.0000,20.0000 L 396.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_50"/><path d=" M 396.0000,177.0000 L 396.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_51"/><path d=" M 408.8000,20.0000 L 408.8000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_53"/><path d=" M 408.8000,179.0000 L 408.8000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_54"/><path d=" M 421.6000,20.0000 L 421.6000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_55"/><path d=" M 421.6000,179.0000 L 421.6000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_56"/><path d=" M 434.4000,20.0000 L 434.4000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_57"/><path d=" M 434.4000,179.0000 L 434.4000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_58"/><path d=" M 447.2000,20.0000 L 447.2000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_59"/><path d=" M 447.2000,179.0000 L 447.2000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_60"/><path d=" M 460.0000,20.0000 L 460.0000,180.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_61"/><path d=" M 460.0000,177.0000 L 460.0000,180.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_62"/><path d=" M 268.0000,200.0000 L 268.0000,0.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_64"/><path d=" M 265.5000,5.0000 L 268.0000,0.0000 L 270.5000,5.0000 L 265.5000,5.0000 z " style="fill: #2e3436; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_65"/><path d=" M 140.0000,148.0000 L 460.0000,148.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_67"/><path d=" M 265.0000,148.0000 L 271.0000,148.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_68"/><path d=" M 140.0000,116.0000 L 460.0000,116.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_70"/><path d=" M 265.0000,116.0000 L 271.0000,116.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_71"/><path d=" M 140.0000,84.0000 L 460.0000,84.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_73"/><path d=" M 265.0000,84.0000 L 271.0000,84.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_74"/><path d=" M 140.0000,52.0000 L 460.0000,52.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_76"/><path d=" M 265.0000,52.0000 L 271.0000,52.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_77"/><path d=" M 140.0000,20.0000 L 460.0000,20.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 0.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_79"/><path d=" M 265.0000,20.0000 L 271.0000,20.0000" style="fill: none; stroke: #2e3436; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_80"/><path d=" M 268.0000,35.1975 L 268.0000,22.3575 L 327.9040,22.3575 L 327.9040,35.1975 L 268.0000,35.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_81"/><path d=" M 268.5000,22.8575 L 327.4040,22.8575 L 327.4040,34.6975 L 268.5000,34.6975 L 268.5000,22.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_82"/><path d=" M 268.0000,67.1975 L 268.0000,54.3575 L 229.3440,54.3575 L 229.3440,67.1975 L 268.0000,67.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_83"/><path d=" M 267.5000,54.8575 L 229.8440,54.8575 L 229.8440,66.6975 L 267.5000,66.6975 L 267.5000,54.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_84"/><path d=" M 268.0000,99.1975 L 268.0000,86.3575 L 185.0560,86.3575 L 185.0560,99.1975 L 268.0000,99.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_85"/><path d=" M 267.5000,86.8575 L 185.5560,86.8575 L 185.5560,98.6975 L 267.5000,98.6975 L 267.5000,86.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_86"/><path d=" M 268.0000,131.1975 L 268.0000,118.3575 L 298.7200,118.3575 L 298.7200,131.1975 L 268.0000,131.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_87"/><path d=" M 268.5000,118.8575 L 298.2200,118.8575 L 298.2200,130.6975 L 268.5000,130.6975 L 268.5000,118.8575 z " style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_88"/><path d=" M 268.0000,163.1975 L 268.0000,150.3575 L 268.2560,150.3575 L 268.2560,163.1975 L 268.0000,163.1975 z " style="fill: #3465a4; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_89"/><path d=" M 268.0000,49.6425 L 268.0000,36.8025 L 407.0080,36.8025 L 407.0080,49.6425 L 268.0000,49.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_90"/><path d=" M 268.5000,37.3025 L 406.5080,37.3025 L 406.5080,49.1425 L 268.5000,49.1425 L 268.5000,37.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_91"/><path d=" M 268.0000,81.6425 L 268.0000,68.8025 L 327.9040,68.8025 L 327.9040,81.6425 L 268.0000,81.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_92"/><path d=" M 268.5000,69.3025 L 327.4040,69.3025 L 327.4040,81.1425 L 268.5000,81.1425 L 268.5000,69.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_93"/><path d=" M 268.0000,113.6425 L 268.0000,100.8025 L 191.7120,100.8025 L 191.7120,113.6425 L 268.0000,113.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_94"/><path d=" M 267.5000,101.3025 L 192.2120,101.3025 L 192.2120,113.1425 L 267.5000,113.1425 L 267.5000,101.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_95"/><path d=" M 268.0000,145.6425 L 268.0000,132.8025 L 269.2800,132.8025 L 269.2800,145.6425 L 268.0000,145.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_96"/><path d=" M 268.5000,133.3025 L 268.7800,133.3025 L 268.7800,145.1425 L 268.5000,145.1425 L 268.5000,133.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_97"/><path d=" M 268.0000,177.6425 L 268.0000,164.8025 L 236.2560,164.8025 L 236.2560,177.6425 L 268.0000,177.6425 z " style="fill: #4e9a06; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_98"/><path d=" M 267.5000,165.3025 L 236.7560,165.3025 L 236.7560,177.1425 L 267.5000,177.1425 L 267.5000,165.3025 z " style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphPolygon_99"/><g id="ezcGraphTextBox_4"><path d=" M 16.5000,17.0000 L 16.5000,1.5000 L 55.1000,1.5000 L 55.1000,17.0000 L 16.5000,17.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_100"/><text id="ezcGraphTextBox_4_text" x="17.0000" text-length="37.1000px" y="13.9000" style="font-size: 14px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">Set 1</text></g><g id="ezcGraphTextBox_6"><path d=" M 16.5000,35.0000 L 16.5000,19.5000 L 55.1000,19.5000 L 55.1000,35.0000 L 16.5000,35.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_101"/><text id="ezcGraphTextBox_6_text" x="17.0000" text-length="37.1000px" y="31.9000" style="font-size: 14px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">Set 2</text></g><g id="ezcGraphTextBox_11"><path d=" M 125.8600,194.0000 L 125.8600,181.5000 L 154.6400,181.5000 L 154.6400,194.0000 L 125.8600,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_102"/><text id="ezcGraphTextBox_11_text" x="126.3600" text-length="27.2800px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">-500</text></g><g id="ezcGraphTextBox_22"><path d=" M 189.8600,194.0000 L 189.8600,181.5000 L 218.6400,181.5000 L 218.6400,194.0000 L 189.8600,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_103"/><text id="ezcGraphTextBox_22_text" x="190.3600" text-length="27.2800px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">-250</text></g><g id="ezcGraphTextBox_41"><path d=" M 321.2700,194.0000 L 321.2700,181.5000 L 343.2300,181.5000 L 343.2300,194.0000 L 321.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_104"/><text id="ezcGraphTextBox_41_text" x="321.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">250</text></g><g id="ezcGraphTextBox_52"><path d=" M 385.2700,194.0000 L 385.2700,181.5000 L 407.2300,181.5000 L 407.2300,194.0000 L 385.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_105"/><text id="ezcGraphTextBox_52_text" x="385.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">500</text></g><g id="ezcGraphTextBox_63"><path d=" M 449.2700,194.0000 L 449.2700,181.5000 L 471.2300,181.5000 L 471.2300,194.0000 L 449.2700,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_106"/><text id="ezcGraphTextBox_63_text" x="449.7700" text-length="20.4600px" y="191.3500" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">750</text></g><g id="ezcGraphTextBox_66"><path d=" M 230.5200,176.0500 L 230.5200,152.4500 L 267.0000,152.4500 L 267.0000,176.0500 L 230.5200,176.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_107"/><text id="ezcGraphTextBox_66_text" x="231.0200" text-length="34.9800px" y="162.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_66_text" x="259.1800" text-length="6.8200px" y="174.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">5</text></g><g id="ezcGraphTextBox_69"><path d=" M 230.5200,144.0500 L 230.5200,120.4500 L 267.0000,120.4500 L 267.0000,144.0500 L 230.5200,144.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_108"/><text id="ezcGraphTextBox_69_text" x="231.0200" text-length="34.9800px" y="130.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_69_text" x="259.1800" text-length="6.8200px" y="142.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">4</text></g><g id="ezcGraphTextBox_72"><path d=" M 230.5200,112.0500 L 230.5200,88.4500 L 267.0000,88.4500 L 267.0000,112.0500 L 230.5200,112.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_109"/><text id="ezcGraphTextBox_72_text" x="231.0200" text-length="34.9800px" y="98.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_72_text" x="259.1800" text-length="6.8200px" y="110.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">3</text></g><g id="ezcGraphTextBox_75"><path d=" M 230.5200,80.0500 L 230.5200,56.4500 L 267.0000,56.4500 L 267.0000,80.0500 L 230.5200,80.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_110"/><text id="ezcGraphTextBox_75_text" x="231.0200" text-length="34.9800px" y="66.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_75_text" x="259.1800" text-length="6.8200px" y="78.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">2</text></g><g id="ezcGraphTextBox_78"><path d=" M 230.5200,48.0500 L 230.5200,24.4500 L 267.0000,24.4500 L 267.0000,48.0500 L 230.5200,48.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_111"/><text id="ezcGraphTextBox_78_text" x="231.0200" text-length="34.9800px" y="34.3000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">sample</text><text id="ezcGraphTextBox_78_text" x="259.1800" text-length="6.8200px" y="46.4000" style="font-size: 11px; font-family: 'sans-serif'; fill: #2e3436; fill-opacity: 1.00; stroke: none;">1</text></g></g></svg>
diff --git a/tests/horizontal_bar_chart_renderer.php b/tests/horizontal_bar_chart_renderer.php
new file mode 100644
index 0000000..7353480
--- /dev/null
+++ b/tests/horizontal_bar_chart_renderer.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * ezcGraphRenderer2dTest
+ *
+ * @package Graph
+ * @version //autogen//
+ * @subpackage Tests
+ * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+
+require_once dirname( __FILE__ ) . '/test_case.php';
+
+/**
+ * Tests for ezcGraph class.
+ *
+ * @package Graph
+ * @subpackage Tests
+ */
+class ezcGraphHorizontalBarRendererTests extends ezcGraphTestCase
+{
+ protected $basePath;
+
+ protected $tempDir;
+
+ public static function suite()
+ {
+ return new PHPUnit_Framework_TestSuite( __CLASS__ );
+ }
+
+ protected function setUp()
+ {
+ static $i = 0;
+ $this->tempDir = $this->createTempDir( __CLASS__ . sprintf( '_%03d_', ++$i ) ) . '/';
+ $this->basePath = dirname( __FILE__ ) . '/data/';
+ }
+
+ protected function tearDown()
+ {
+ if ( !$this->hasFailed() )
+ {
+ $this->removeTempDir();
+ }
+ }
+
+ public function testRenderBasicHorizontalBarChart()
+ {
+ $filename = $this->tempDir . __FUNCTION__ . '.svg';
+
+ $chart = new ezcGraphHorizontalBarChart();
+
+ $chart->data['Set 1'] = new ezcGraphArrayDataSet( array( 'sample 1' => 234, 'sample 2' => 151, 'sample 3' => 324, 'sample 4' => 120, 'sample 5' => 1 ) );
+
+ $chart->render( 500, 200, $filename );
+
+ $this->compare(
+ $filename,
+ $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
+ );
+ }
+
+ public function testRenderHorizontalBarChartMultipleBars()
+ {
+ $filename = $this->tempDir . __FUNCTION__ . '.svg';
+
+ $chart = new ezcGraphHorizontalBarChart();
+
+ $chart->data['Set 1'] = new ezcGraphArrayDataSet( array( 'sample 1' => 234, 'sample 2' => 151, 'sample 3' => 324, 'sample 4' => 120, 'sample 5' => 1 ) );
+ $chart->data['Set 2'] = new ezcGraphArrayDataSet( array( 'sample 1' => 543, 'sample 2' => 234, 'sample 3' => 298, 'sample 4' => 5, 'sample 5' => 124) );
+
+ $chart->render( 500, 200, $filename );
+
+ $this->compare(
+ $filename,
+ $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
+ );
+ }
+
+ public function testRenderHorizontalBarChartNegativeValues()
+ {
+ $filename = $this->tempDir . __FUNCTION__ . '.svg';
+
+ $chart = new ezcGraphHorizontalBarChart();
+
+ $chart->data['Set 1'] = new ezcGraphArrayDataSet( array( 'sample 1' => 234, 'sample 2' => -151, 'sample 3' => -324, 'sample 4' => 120, 'sample 5' => 1 ) );
+ $chart->data['Set 2'] = new ezcGraphArrayDataSet( array( 'sample 1' => 543, 'sample 2' => 234, 'sample 3' => -298, 'sample 4' => 5, 'sample 5' => -124) );
+
+ $chart->render( 500, 200, $filename );
+
+ $this->compare(
+ $filename,
+ $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
+ );
+ }
+}
+?>
diff --git a/tests/suite.php b/tests/suite.php
index ff3c108..de5148f 100644
--- a/tests/suite.php
+++ b/tests/suite.php
@@ -49,6 +49,7 @@ require_once 'radar_chart.php';
require_once 'renderer_2d_test.php';
require_once 'renderer_2d_legacy_test.php';
require_once 'renderer_3d_test.php';
+require_once 'horizontal_bar_chart_renderer.php';
require_once 'struct_test.php';
require_once 'text_test.php';
require_once 'tools_test.php';
@@ -103,6 +104,7 @@ class ezcGraphSuite extends PHPUnit_Framework_TestSuite
$this->addTest( ezcGraphRenderer2dTest::suite() );
$this->addTest( ezcGraphRenderer2dLegacyTest::suite() );
$this->addTest( ezcGraphRenderer3dTest::suite() );
+ $this->addTest( ezcGraphHorizontalBarRendererTests::suite() );
$this->addTest( ezcGraphStructTest::suite() );
$this->addTest( ezcGraphSvgDriverTest::suite() );
$this->addTest( ezcGraphSvgSvgFontDriverTest::suite() );
OpenPOWER on IntegriCloud