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
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()));
![Kiran](https://i.stack.imgur.com/uh4P0.png?s=256&g=1)
Author by
Kiran
Updated on July 25, 2022Comments
-
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:
But i need to draw a graph with following property:
- X-axis will have to display current time.as show in below graph time is some where >2am
- each bar in X-axis is 5 minutes bar
- for every 5 minutes i send a data it should draw a bar based on value.
- for now ignore Y axis parameter just need how to plot required X-aixs
The Graph some what looks like this:
-
Kiran about 11 yearsplease can u explain me with an example sir..Regarding unix timestamps on x axis..
-
Kiran about 11 yearsif 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 about 11 yearsand 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 about 11 years
-
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 thiss1,s3,s2
s3,s2,s1
s1,s2,s3
s1,s3,s2
s3,s1,s2
... so on