bar graph using AChartEngine library

10,023

Solution 1

i did something like this:: for static data

public class MainActivity extends Activity {
 final Calendar c = Calendar.getInstance();
        int mMinute = c.get(Calendar.MINUTE);
        int mHour = c.get(Calendar.HOUR_OF_DAY);
        int am =c.get(Calendar.AM_PM); 
       int[] x =new int[1920];
        int[] sleep = {4,3,2,1,4,3,2,1,4,3,2,1,4,1,1,1,4,4,2,2,2,3,3,2,2,2,2,2,1,1,1,1,1,1,4,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2};      
  public String getnext(int a)
  {
      String ap;
      if(am==1){ap="PM";}
      else{ap="AM";}
    String s= mHour+" "+ap;
    mMinute=mMinute+5;

    if (mHour >=12){
        mHour=mHour-12;
        switch(am){case 0:am=1; break; case 1:am=0;break;}
    }
        if(mMinute >= 60)
        {
            mHour= mHour+1;
            mMinute=mMinute-60;
        }
        //Log.d("Gr","mMinute: "+mMinute);
        if(mMinute==1 | mMinute==2 | mMinute==3 |mMinute==4 | mMinute==0)
        {s= mHour+" "+ap;}
        else{s="";}

        return (s);}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  //  setContentView(R.layout.activity_main);

    openChart();
   }


private void openChart(){
    XYSeries sleepSeries = new XYSeries("Sleep");

    for(int i=0;i<sleep.length;i++){   
        sleepSeries.add(i,sleep[i]);
    }


    // Creating a dataset to hold each series
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    // Adding Income Series to the dataset
    dataset.addSeries(sleepSeries);     


    // Creating XYSeriesRenderer to customize incomeSeries
    XYSeriesRenderer sleepRenderer = new XYSeriesRenderer();
    sleepRenderer.setColor(Color.GREEN);
    sleepRenderer.setFillPoints(true);

    sleepRenderer.setLineWidth((float) .2);

    // Creating a XYMultipleSeriesRenderer to customize the whole chart
    XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
    multiRenderer.setXLabels(0);
    multiRenderer.setYAxisMin(0);
    multiRenderer.setYLabels(0);
    multiRenderer.setYAxisMax(4);
    multiRenderer.setChartTitle("Sleep vs Time"); 
    multiRenderer.setBarSpacing(.5);
    //multiRenderer.setZoomButtonsVisible(true);
    multiRenderer.setLegendHeight((int) 5);
    multiRenderer.setPanEnabled(true, false);

    multiRenderer.addSeriesRenderer(sleepRenderer);

    // Creating an intent to plot bar chart using dataset and multipleRenderer      
    Intent intent = ChartFactory.getBarChartIntent(getBaseContext(), dataset, renderer, Type.DEFAULT);

    // Start Activity
    startActivity(intent);

}

i got graph like

df

UPDATE:::

for real time data , update series like

 static ArrayList<Integer> sleep = new ArrayList<Integer>();

as and when newval is available

 sleep.add(newval);

then call openChart(); in that first clear dataset (dataset.clear();) then call repaint();

Solution 2

You can keep Unix timestamps on the X axis and control the labels yourself. You can add custom X axis labels using:

renderer.addXTextLabel(x, "label");

A Unix timestamp is the value that the getTime() on a Date object returns. So you can add such values to your series:

series.add(date.getTime(), value);

Then, you can add custom labels for some of the values:

SimpleDateFormat format = new SimpleDateFormat("h a");
renderer.addXTextLabel(date.getTime(), format.format(date.getTime()));
Share:
10,023
Kiran
Author by

Kiran

Updated on July 25, 2022

Comments

  • Kiran
    Kiran almost 2 years

    I have a bar graph using AChartEngine library as shown below ::

    public class MainActivity extends Activity {
    
      private String[] mMonth = new String[] {
                "Jan", "Feb" , "Mar", "Apr", "May", "Jun",
                "Jul", "Aug" , "Sep", "Oct", "Nov", "Dec"
            };
    
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Getting reference to the button btn_chart
        Button btnChart = (Button) findViewById(R.id.btn_chart);
    
        // Defining click event listener for the button btn_chart
        OnClickListener clickListener = new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // Draw the Income vs Expense Chart
                openChart();                
            }
        };
    
        // Setting event click listener for the button btn_chart of the MainActivity layout
        btnChart.setOnClickListener(clickListener);
    
    }
    
    private void openChart(){
        int[] x = { 0,1,2,3,4,5,6,7 };
        int[] income = { 2000,2500,2700,3000,2800,3500,3700,3800};
        int[] expense = {2200, 2700, 2900, 2800, 2600, 3000, 3300, 3400 };
    
        // Creating an  XYSeries for Income
        //CategorySeries incomeSeries = new CategorySeries("Income");
        XYSeries incomeSeries = new XYSeries("Income");
        // Creating an  XYSeries for Income
        XYSeries expenseSeries = new XYSeries("Expense");
        // Adding data to Income and Expense Series
        for(int i=0;i<x.length;i++){            
            incomeSeries.add(i,income[i]);
            expenseSeries.add(i,expense[i]);
        }
    
    
        // Creating a dataset to hold each series
        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
        // Adding Income Series to the dataset
        dataset.addSeries(incomeSeries);
        // Adding Expense Series to dataset
        dataset.addSeries(expenseSeries);       
    
        // Creating XYSeriesRenderer to customize incomeSeries
        XYSeriesRenderer incomeRenderer = new XYSeriesRenderer();
        incomeRenderer.setColor(Color.rgb(130, 130, 230));
        incomeRenderer.setFillPoints(true);
        incomeRenderer.setLineWidth(2);
        incomeRenderer.setDisplayChartValues(true);
    
        // Creating XYSeriesRenderer to customize expenseSeries
        XYSeriesRenderer expenseRenderer = new XYSeriesRenderer();
        expenseRenderer.setColor(Color.rgb(220, 80, 80));
        expenseRenderer.setFillPoints(true);
        expenseRenderer.setLineWidth(2);
        expenseRenderer.setDisplayChartValues(true);        
        Calendar cal = Calendar.getInstance();
        cal.clear(Calendar.HOUR);
        // Creating a XYMultipleSeriesRenderer to customize the whole chart
        XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
        multiRenderer.setXLabels(0);
        multiRenderer.setChartTitle("Income vs Expense Chart");
        multiRenderer.setXTitle("Year 2012");
        multiRenderer.setYTitle("Amount in Dollars");
        multiRenderer.setZoomButtonsVisible(true);              
        for(int i=0; i< x.length;i++){
            multiRenderer.addXTextLabel(i, mMonth[i]);          
        }       
    
        // Adding incomeRenderer and expenseRenderer to multipleRenderer
        // Note: The order of adding dataseries to dataset and renderers to multipleRenderer
        // should be same
        multiRenderer.addSeriesRenderer(incomeRenderer);
        multiRenderer.addSeriesRenderer(expenseRenderer);
    
        // Creating an intent to plot bar chart using dataset and multipleRenderer      
        Intent intent = ChartFactory.getBarChartIntent(getBaseContext(), dataset, multiRenderer, Type.DEFAULT);
    
        // Start Activity
        startActivity(intent);
    
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
     }
    }
    

    Above code graph looks like:

    pic

    But i need to draw a graph with following property:

    1. X-axis will have to display current time.as show in below graph time is some where >2am
    2. each bar in X-axis is 5 minutes bar
    3. for every 5 minutes i send a data it should draw a bar based on value.
    4. for now ignore Y axis parameter just need how to plot required X-aixs

    The Graph some what looks like this:

    pic

  • Kiran
    Kiran about 11 years
    please can u explain me with an example sir..Regarding unix timestamps on x axis..
  • Kiran
    Kiran about 11 years
    if i had understood wat u have explained here sir, then surely would accept ur answer ,, i have not used ur method series.add(date.getTime(), value); in my code u can just check tat ..if u don't mind to explain me clearly ur method will be thankful to u , and happily award tat bounty
  • Kiran
    Kiran about 11 years
    and my ans does't work good for dynamic data , when i use repaint(); on receiving new data the bar width keep on decreasing ,.. so wat may be the problem
  • Kiran
    Kiran about 11 years
  • Kiran
    Kiran about 11 years
    @ Dan:: is there any API to change positon of bars in multi series bar graph, s1,s2,s3 rae series if we plot graph we get s1,s2,s3 s1,s2,s3 s1,s2,s3 s1,s2,s3 ....so on is there anyway to change it every time based on value to plot like this s1,s3,s2 s3,s2,s1 s1,s2,s3 s1,s3,s2 s3,s1,s2 ... so on