beck
beck

Reputation: 3027

Showing bar graph horizontally

How can I display bar graph as this?

enter image description here

Presently by default the bar graph is upside down. There are many bars so I need it stacked from top to bottom.

public void showBarDiagram() {
    String[] titles = new String[]{""};
    List<double[]> values = new ArrayList<double[]>();
    values.add(new double[]{14230, 12300, 14240, 300, 15900, 19200, 22030, 21200, 19500, 15500,
        12600, 14000});
    int[] colors = new int[]{ColorUtil.BLUE};
    XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
    setChartSettings(renderer, "Enquiry", "Month", "", 0.5,
            12.5, 0, 24000, ColorUtil.GRAY, ColorUtil.LTGRAY);
    ((XYSeriesRenderer) renderer.getSeriesRendererAt(0)).setDisplayChartValues(true);
    renderer.setXLabels(12);
    renderer.setYLabels(10);
    renderer.setXLabelsAlign(Component.LEFT);
    renderer.setYLabelsAlign(Component.LEFT);
     renderer.setZoomEnabled(false);
    renderer.setZoomRate(1.1f);
    renderer.setBarSpacing(0.5f);
    initRendererer(renderer);
    BarChart chart = new BarChart(buildBarDataset(titles, values), renderer,
            BarChart.Type.STACKED);
    ChartComponent c = new ChartComponent(chart);
    c.setFocusable(true);
    c.setZoomEnabled(true);
    c.setPanEnabled(true);
    barContainer.add(c);
}

protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
    XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
    renderer.setAxisTitleTextSize(smallFont.getHeight() / 2);
    renderer.setChartTitleTextFont(smallFont);
    renderer.setLabelsTextSize(smallFont.getHeight() / 2);
    renderer.setLegendTextSize(smallFont.getHeight() / 2);
    int length = colors.length;
    for (int i = 0; i < length; i++) {
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(colors[i]);
        renderer.addSeriesRenderer(r);
    }
    return renderer;
}

protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle,
        String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor,
        int labelsColor) {
    renderer.setChartTitle(title);
    renderer.setXTitle(xTitle);
    renderer.setYTitle(yTitle);
    renderer.setXAxisMin(xMin);
    renderer.setXAxisMax(xMax);
    renderer.setYAxisMin(yMin);
    renderer.setYAxisMax(yMax);
    renderer.setAxesColor(axesColor);
    renderer.setLabelsColor(labelsColor);
}

protected void initRendererer(DefaultRenderer renderer) {
    renderer.setBackgroundColor(0xffffffff);
    renderer.setApplyBackgroundColor(true);
    renderer.setLabelsColor(0xff000000);
    renderer.setAxesColor(0xff000000);
    if(Font.isNativeFontSchemeSupported()) {
        Font fnt = Font.createTrueTypeFont("native:MainLight", "native:MainLight").
                derive(Display.getInstance().convertToPixels(2.5f), Font.STYLE_PLAIN);
        renderer.setTextTypeface(fnt);
        renderer.setChartTitleTextFont(fnt);
        renderer.setLabelsTextFont(fnt);
        renderer.setLegendTextFont(fnt);

        if(renderer instanceof XYMultipleSeriesRenderer) {
            ((XYMultipleSeriesRenderer)renderer).setAxisTitleTextFont(fnt);
        }
        if(renderer instanceof XYMultipleSeriesRenderer) {
            XYMultipleSeriesRenderer x = (XYMultipleSeriesRenderer)renderer;
            x.setMarginsColor(0xfff7f7f7);
            x.setXLabelsColor(0xff000000);
            x.setYLabelsColor(0, 0xff000000);
        }
    }
}

protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List<double[]> values) {
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    int length = titles.length;
    for (int i = 0; i < length; i++) {
        CategorySeries series = new CategorySeries(titles[i]);
        double[] v = values.get(i);
        int seriesLength = v.length;
        for (int k = 0; k < seriesLength; k++) {
            series.add(v[k]);
        }
        dataset.addSeries(series.toXYSeries());
    }
    return dataset;
}

protected ChartComponent newChart(AbstractChart chart) {

    ChartComponent c = new ChartComponent(chart);
    c.setFocusable(true);
    c.setZoomEnabled(true);
    c.setPanEnabled(true);
    return c;
}

Update 1:

setChartSettings(renderer, "", "", "No", 0.5, 17.5, 0, 400, ColorUtil.GRAY, ColorUtil.LTGRAY);

enter image description here

I used orientation vertical in chartSetting but got into trouble with x,y axis value exchange.

XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
renderer.setOrientation(XYMultipleSeriesRenderer.Orientation.VERTICAL);
setChartSettings(renderer, "No", "", "",  0, 400,0.5, 17.5, ColorUtil.GRAY, ColorUtil.LTGRAY);

enter image description here

Upvotes: 1

Views: 71

Answers (1)

steve hannah
steve hannah

Reputation: 4716

XYMultipleSeriesRenderer incldudes a setOrientation method.

XYMultipleSeriesRenderer renderer = buildBarRenderer(colors); 
renderer.setOrientation(Orientation.HORIZONTAL);

That should achieve the desired effect.

Upvotes: 1

Related Questions