Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bar graph using AChartEngine library

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

like image 425
Kiran Avatar asked Apr 01 '13 06:04

Kiran


2 Answers

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();

like image 120
Kiran Avatar answered Oct 15 '22 03:10

Kiran


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()));
like image 42
Dan D. Avatar answered Oct 15 '22 03:10

Dan D.