9

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

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Kiran
  • 3,095
  • 5
  • 23
  • 38

3 Answers3

5

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

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Kiran
  • 3,095
  • 5
  • 23
  • 38
4

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()));
Dan D.
  • 32,246
  • 5
  • 63
  • 79
  • please can u explain me with an example sir..Regarding unix timestamps on x axis.. – Kiran Apr 05 '13 at 03:48
  • 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 Apr 12 '13 at 03:39
  • 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 Apr 12 '13 at 05:50
  • [this is how graph looks when i pass new data and repaint](http://i50.tinypic.com/2wc37tg.png) – Kiran Apr 12 '13 at 06:05
  • @ 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 – Kiran May 03 '13 at 12:17
0

I think for your requirement, Creating custom bar charts will make easy.Here is the example, you can develop with this example by simply using 5 arrays which you want to show on graph.

Bar Chart in Android With out any Built in jars

Just, go thorough the example and check it.

The main advantage is you need not use any predefined libraries for drawing charts. it will be possible with simple android UI like TextView and ListView

Ram kiran Pachigolla
  • 20,897
  • 15
  • 57
  • 78