@Override
	public String getSVG( HashMap<String, Double> chartMetrics, HashMap<String, Object> axisMetrics, ChartSeries s )
	{
		double x = chartMetrics.get( "x" );
		double y = chartMetrics.get( "y" );
		double w = chartMetrics.get( "w" );
		double h = chartMetrics.get( "h" );
		double max = chartMetrics.get( "max" );
		double min = chartMetrics.get( "min" );
		Object[] categories = s.getCategories();
		ArrayList series = s.getSeriesValues();
		String[] seriescolors = s.getSeriesBarColors();
		String[] legends = s.getLegends();
		if( series.size() == 0 )
		{
			log.error( "Bar.getSVG: error in series" );
			return "";
		}
		StringBuffer svg = new StringBuffer();
		int shape = cf.getBarShape();
		if( (shape == ChartConstants.SHAPECONE) ||
				(shape == ChartConstants.SHAPECYLINDER) ||
				(shape == ChartConstants.SHAPEPYRAMID) )
		{
			;    // TODO: SOMETHING!!! Interpret Shape for Pyramid, etc. charts
		}

		int[] dls = getDataLabelInts(); // get array of data labels (can be specific per series ...)
		int n = series.size();
		svg.append( "<g>\r\n" );

		double barw = 0;    //
		double yfactor = 0;
		barw = h / ((categories.length + 1.0) * (n + 1));    // bar width= height/total number of bars+separators
		if( max != 0 )
		{
			yfactor = w / max;        // w/yMax= scale unit
		}

		int rf = 1;    //(!yAxisReversed?1:-1);
		double y0 = (h + y) - (barw * 0.5);    //start at bottom and work up (unless reversed)
		// for each series
		for( int i = 0; i < n; i++ )
		{    // each series group i.e. each bar with a different color
			svg.append( "<g>\r\n" );
			double[] curseries = (double[]) series.get( i );
			String[] curranges = (String[]) s.getSeriesRanges().get( i );
			for( int j = 0; j < curseries.length; j++ )
			{        // each category (group of series)
//						double y= y0 - barw*(i+1)*rf - (j*n*barw*1.5)*rf;		// y goes from 1 series to next, corresponding to bar/column color
				double yy = y0 - (barw * (n + 1) * 1.1 * (j)) - (barw * (i + 1)) - ((barw * 1.5) * rf) /* start */;
				double ww = yfactor * curseries[j];                            // width of bar -- measure of series
				svg.append( "<rect " + getScript( curranges[j] ) + " fill='" + seriescolors[i] + "' fill-opacity='1' stroke='black' stroke-opacity='1' stroke-width='1' stroke-linecap='butt' stroke-linejoin='miter' stroke-miterlimit='4'" +
						            " x='" + x + "' y='" + yy + "' width='" + ww + "' height='" + barw + "' fill-rule='evenodd'/>" );
				String l = getSVGDataLabels( dls, axisMetrics, curseries[j], 0, i, legends, categories[j].toString() );
				if( l != null )
				{
					svg.append( "<text x='" + (x + ww + 10) + "' y='" + (yy + (barw * rf)) +
							            "' " + getDataLabelFontSVG() + ">" + l + "</text>\r\n" );
				}
			}
			svg.append( "</g>\r\n" );        // each series group
		}
		svg.append( "</g>\r\n" );
		return svg.toString();
	}