mithu
mithu

Reputation: 177

Bar graph using AchartEngine

I have created bar graph using aChartEngine library. Can anyone help me how to increase the width of the bars and position the bars at the centre of X-axis?

This is my BarGraph class:

public class BarGraph {
public Intent getIntent(Context context){
     XYMultipleSeriesRenderer mrenderer = new XYMultipleSeriesRenderer();
     double[] range = {0,5,0,5};

        int[] y = {24,30,12};
        CategorySeries series1 = new CategorySeries("Today");
        CategorySeries series2 = new CategorySeries("Next day");
        CategorySeries series3 = new CategorySeries("2 days later");

        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

     for (int i=0;i<3;i++){
         switch(i){
         case 0:
                series1.add(y[0]);
                dataset.addSeries(series1.toXYSeries());
                break;
         case 1:
                series2.add(y[1]);
                dataset.addSeries(series2.toXYSeries());
                break;
         case 2:
                series3.add(y[2]);
                dataset.addSeries(series3.toXYSeries());
                break;
         }
     }

    XYSeriesRenderer renderer1 = new XYSeriesRenderer();
    renderer1.setColor(Color.GREEN);
    XYSeriesRenderer renderer2 = new XYSeriesRenderer();
    renderer2.setColor(Color.BLUE);
    XYSeriesRenderer renderer3 = new XYSeriesRenderer();
    renderer3.setColor(Color.RED);
        mrenderer.setAxisTitleTextSize(16);
        mrenderer.setChartTitleTextSize(20);
        mrenderer.setLabelsTextSize(15);
        mrenderer.setLegendTextSize(15);
        mrenderer.setBarSpacing(0);
        mrenderer.setXLabels(1);
        mrenderer.addXTextLabel(2.5, "Outstanding jobs");
        mrenderer.setMargins(new int[] {20, 30, 15, 0});
        mrenderer.setAxesColor(Color.WHITE);
        mrenderer.setChartTitle("Work per day");
        mrenderer.setXTitle("Days");
        mrenderer.setInitialRange(range, 1);
        mrenderer.setBarSpacing(1);
        mrenderer.setXAxisMin(0);
        mrenderer.setXAxisMax(5);
        mrenderer.setYAxisMin(0);
        mrenderer.setPanEnabled(false, false);
        mrenderer.setZoomEnabled(false, false);
        mrenderer.addSeriesRenderer(renderer1);
        mrenderer.addSeriesRenderer(renderer2);
        mrenderer.addSeriesRenderer(renderer3);
    Intent intent = ChartFactory.getBarChartIntent(context, dataset, mrenderer, Type.DEFAULT);
    return intent;  
}}

This is the screenshot of the bargraph that i get, Bargraph

I need a bargraph like this,

Bargraph

How can i achieve this? Please help me.

Upvotes: 3

Views: 4334

Answers (4)

Resh
Resh

Reputation: 3

i got an answer.... :) i used setBarspacing, but setting the value 0 or 0.5... The chart can be moved so the values are easily visible...... :)

XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();         
        multiRenderer.setXLabels(0);  
        multiRenderer.setLabelsTextSize(15);
        multiRenderer.setBarSpacing(0.5);
        multiRenderer.setChartTitle("Commercial Complex APK"); 
        multiRenderer.setXTitle("Projects"); 
        multiRenderer.setYTitle("Variance");         
        multiRenderer.setZoomButtonsVisible(true);

Upvotes: 0

Abhijit Chakra
Abhijit Chakra

Reputation: 3236

Remove the for loop and switch case i think that is unnecessary.and add two blank categories series like

 CategorySeries series(nameit) = new CategorySeries("");
 CategorySeries series(nameit) = new CategorySeries("");

place it one after CategoriesSeries series1 and the other after CategoriesSeries series2. then add zero values two place one after series1 and the other after series2 like

  series(name it).add(0);
    dataset.addSeries(series(name it).toXYSeries());

and the same do with the renderer :Make two XYSeriesRenderer as Transparent color and paste them after renderer1 and the other after renderer2 like this

XYSeriesRenderer renderer(nameit) = new XYSeriesRenderer();
    renderer1.setColor(Color.TRANSPARENT);
XYSeriesRenderer renderer(nameit) = new XYSeriesRenderer();
    renderer1.setColor(Color.TRANSPARENT);

and see the magic you got what you want.cheers

Upvotes: 0

Lalit Sharma
Lalit Sharma

Reputation: 1150

If you want to set width of the bars--

try this...

    renderer.setBarSpacing(-0.7);

Upvotes: 4

Erik Lindholm
Erik Lindholm

Reputation: 81

The only way that I found to fix your problem is a quite ugly but until they improve colour management in achartengine it might be as good as it gets.

Firstly remove the for-case as per larlins suggestion.

Then add empty points to the other series corresponding to the filled points in the other series:

    series1.add(1,y[0]);
    series1.add(2,0);
    series1.add(3,0);
    dataset.addSeries(series1);
    series2.add(1,0);
    series2.add(2,y[1]);
    series2.add(3,0);
    dataset.addSeries(series2);
    series3.add(1,0);
    series3.add(2,0);
    series3.add(3,y[2]);
    dataset.addSeries(series3);

Also set the BarSpacing to 0 and the Type to Type.STACKED instead of Type.DEFAULT. I think it would look better if you removed the Label and changed the XTitle to "Outstanding Jobs"

Upvotes: 2

Related Questions