I'm displaying set of dates by x-axis and scores by y-axis. But now dates displaying like this skipping whole weeks from 11 to 27 and then 12. But should be 11-18-25-1 - every week.
I saw similar questions here. But not really get how to implement it. Now I'm doing this chart like this:
private String[] xValues = null;
private double[] yValues = null;
/** The main dataset that includes all the series that go into a chart. */
private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
/** The main renderer that includes all the renderers customizing a chart. */
private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
/** The most recently added series. */
private XYSeries mCurrentSeries;
/** The most recently created renderer, customizing the current series. */
private XYSeriesRenderer mCurrentRenderer;
private GraphicalView mChartView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
// set some properties on the main renderer
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(getResources().getColor(R.color.bkg_green));
mRenderer.setAxisTitleTextSize(25);
mRenderer.setChartTitleTextSize(25);
mRenderer.setLabelsTextSize(20);
mRenderer.setLegendTextSize(25);
mRenderer.setShowGrid(true);
mRenderer.setMargins(new int[] {50, 50, 25, 25 });
mRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
mRenderer.setAxesColor(getResources().getColor(R.color.white));
mRenderer.setLabelsColor(getResources().getColor(R.color.white));
mRenderer.setXLabelsColor(getResources().getColor(R.color.white));
mRenderer.setYLabelsColor(0, getResources().getColor(R.color.white));
mRenderer.setZoomEnabled(true,false);
mRenderer.setPointSize(5);
mRenderer.setPanEnabled(true, false);
}
//init chart with data
#Override public void onSuccess(final GraphResponse response) {
runOnUiThread(new Runnable() {
#Override public void run() {
mProgressBar.setVisibility(View.INVISIBLE);
response.clearFromNullPoints();
xValues = new String[response.getData().size()];
yValues = new double[response.getData().size()];
for (int i = 0; i < response.getData().size(); i++) {
xValues[i] = response.getData().get(i).getDate();
yValues[i] = response.getData().get(i).getValue();
}
if (mChartView == null) {
LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
mChartView = ChartFactory.getTimeChartView(getApplicationContext(), mDataset, mRenderer,
"dd.MM.yyyy");
layout.addView(mChartView,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
addSeries();
} else {
mChartView.repaint();
}
}
});
}
void addSeries() {
TimeSeries series = new TimeSeries("Progress");
// populate data
for (int i = 0; i < xValues.length; i++) {
try {
series.add(dateFormat.parse(xValues[i]), yValues[i]);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
mDataset.addSeries(series);
mCurrentSeries = series;
// create a new renderer for the new series
XYSeriesRenderer renderer = new XYSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
// set some renderer properties
renderer.setPointStyle(PointStyle.CIRCLE);
renderer.setFillPoints(true);
renderer.setDisplayChartValues(true);
renderer.setDisplayChartValuesDistance(40);
renderer.setChartValuesTextSize(30);
renderer.setColor(getResources().getColor(R.color.white));
renderer.setLineWidth(3.0f);
mCurrentRenderer = renderer;
mChartView.repaint();
}
How to display dates by x-axis with specific period - one week?
You probably want to have the chart display the actual data labels rather than the rounded ones. So, I suggest you do:
mRenderer.setXRoundedLabels(false);
Update: Another way to set your own labels is to disable the regular labels and add your custom ones:
mRenderer.setXLabels(0);
// one such call for every label
mRenderer.addXTextLabel(x, label);
I finally ended up setting own xAxis displaying period:
mRenderer.setXAxisMin(series.getX(0));
mRenderer.setXAxisMax(series.getX(0) + ONE_MONTH);
And setting up grid with 4 labels:
mRenderer.setXLabels(4);
Which give period 8 days and nice one month displaying on full width of display.
Related
ScreenShot
Hello, i have a trouble with bar chart, i must remove this sticks on X and Y axis above numbers but i don't know how to do this, here is my code for creating chart: `String[] monthDays = new String[lastDayOfMonth];
// Create month days labels
int[] x = new int[lastDayOfMonth];
for (int i = 0; i < monthDays.length; i++) {
monthDays[i] = "" + (i + 1);
x[i] = i + 1;
}
// Create series
XYSeries majorSeries = new XYSeries("Major");
XYSeries middleSeries = new XYSeries("Middle");
XYSeries minorSeries = new XYSeries("Minor");
XYSeries restSeries = new XYSeries("Rest");
// Add data to series
for(int i = 0; i < x.length; i++) {
majorSeries.add(i, majorData[i]);
middleSeries.add(i, middleData[i]);
minorSeries.add(i, minorData[i]);
restSeries.add(i, restData[i]);
}
// Create series data set
XYMultipleSeriesDataset xyMultipleSeriesDataset = new XYMultipleSeriesDataset();
// Add series to data set
xyMultipleSeriesDataset.addSeries(restSeries);
xyMultipleSeriesDataset.addSeries(minorSeries);
xyMultipleSeriesDataset.addSeries(middleSeries);
xyMultipleSeriesDataset.addSeries(majorSeries);
// Create series render for major data set
XYSeriesRenderer majorXySeriesRenderer = new XYSeriesRenderer();
majorXySeriesRenderer.setColor(Color.parseColor("#4797b4"));
majorXySeriesRenderer.setFillPoints(true);
majorXySeriesRenderer.setLineWidth(2);
// Create series render for middle data set
XYSeriesRenderer middleXySeriesRenderer = new XYSeriesRenderer();
middleXySeriesRenderer.setColor(Color.parseColor("#4ec697"));
middleXySeriesRenderer.setFillPoints(true);
middleXySeriesRenderer.setLineWidth(2);
// Create series render for minor data set
XYSeriesRenderer minorXySeriesRenderer = new XYSeriesRenderer();
minorXySeriesRenderer.setColor(Color.parseColor("#1fb1ba"));
minorXySeriesRenderer.setFillPoints(true);
minorXySeriesRenderer.setLineWidth(2);
// Create series render for rest data set
XYSeriesRenderer restXySeriesRenderer = new XYSeriesRenderer();
restXySeriesRenderer.setColor(Color.parseColor("#c2c2c2"));
restXySeriesRenderer.setFillPoints(true);
restXySeriesRenderer.setLineWidth(2);
// Creating XYMultipleSeriesRenderer to customize chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.HORIZONTAL);
// Add labels to x
for(int i = 0; i < monthDays.length; i++) {
multiRenderer.addXTextLabel(i, monthDays[i]);
}
multiRenderer.setXLabels(0);
multiRenderer.setYLabels(0);
multiRenderer.setXLabelsColor(Color.BLACK);
multiRenderer.setYLabelsColor(0, Color.BLACK);
multiRenderer.setLabelsTextSize(24);
multiRenderer.setZoomButtonsVisible(false);
multiRenderer.setPanEnabled(true, false);
multiRenderer.setPanLimits(new double[] {-0.75, 31, 0, 0});
multiRenderer.setClickEnabled(false);
multiRenderer.setZoomEnabled(false, false);
multiRenderer.setShowGridY(false);
multiRenderer.setShowGridX(false);
multiRenderer.setFitLegend(true);
multiRenderer.setShowAxes(false);
multiRenderer.setShowLegend(false);
multiRenderer.setShowGrid(false);
multiRenderer.setZoomEnabled(false);
multiRenderer.setExternalZoomEnabled(false);
multiRenderer.setAntialiasing(true);
multiRenderer.setInScroll(true);
multiRenderer.setLegendHeight(30);
multiRenderer.setXLabelsAlign(Paint.Align.CENTER);
multiRenderer.setYLabelsAlign(Paint.Align.LEFT);
multiRenderer.setTextTypeface("sans_serif", Typeface.NORMAL);
multiRenderer.setYAxisMax(maxValue + (maxValue * 2 / 100));
multiRenderer.addYTextLabel(0, currency + "0.0");
if (maxValue == 0) {
multiRenderer.setYAxisMax(500);
multiRenderer.addYTextLabel(500, currency + maxValue);
} else {
multiRenderer.addYTextLabel(multiRenderer.getYAxisMax(), currency + maxValue);
}
multiRenderer.setXAxisMin(-0.5);
multiRenderer.setXAxisMax(11);
multiRenderer.setBarSpacing(0.5);
multiRenderer.setBackgroundColor(Color.TRANSPARENT);
multiRenderer.setMarginsColor(Color.argb(0x00, 0xff, 0x00, 0x00));
multiRenderer.setApplyBackgroundColor(true);
multiRenderer.setMargins(new int[]{30, 30, 30, 30});
// Add all renders to multi render
multiRenderer.addSeriesRenderer(restXySeriesRenderer);
multiRenderer.addSeriesRenderer(minorXySeriesRenderer);
multiRenderer.addSeriesRenderer(middleXySeriesRenderer);
multiRenderer.addSeriesRenderer(majorXySeriesRenderer);
// Create array of chart types
CombinedXYChart.XYCombinedChartDef[] types = new CombinedXYChart.XYCombinedChartDef[]{
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 0),
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 1),
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 2),
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 3)};
// Get view of chart
GraphicalView graphicalView = ChartFactory.getCombinedXYChartView(getContext(), xyMultipleSeriesDataset, multiRenderer, types);
chart.removeAllViews();
chart.addView(graphicalView);`
Solved
To do this you can set labels color same as your background or transparent
multiRenderer.setXLabelsColor(Color.WHITE);
multiRenderer.setYLabelsColor(0, Color.WHITE);
After this you have to create your own class that extends chart class witch you need
public class MyChart extends CombinedXYChart {
int color;
public MyChart(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, XYCombinedChartDef[] chartDefinitions) {
super(dataset, renderer, chartDefinitions);
}
#Override
protected void drawString(Canvas canvas, String text, float x, float y, Paint paint) {
paint.setColor(color);
super.drawString(canvas, text, x, y, paint);
}
public void setColor(int color) {
this.color = color;
}}
And finally you have to use your own class to create graphicalView and place it in layout
MyChart myChart = new MyChart(xyMultipleSeriesDataset, multiRenderer, types);
myChart.setColor(Color.BLACK);
GraphicalView graphicalView = new GraphicalView(getContext(), myChart);
This steps will override method from AbstractChart class witch draws only text values in your chart, but sticks will remain same color as your background, so they would be invisible
Today I am come across a problem in Drawing out Graph in Android Pro-grammatically. I am Using Achartengine graph library for achieving this , I have done with simple pie chart , But I have no clue how to make Concentric pie chart using this .
Here is a demo Image of graph which I want to make.
Thanx for help in advance :)
Here is the example, first create a LinearLayout in your view(xml) and get it in your activityto pass it SingleDonutGraph class to draw a donut graph on this layout.You also have to pass graphValues[]as double array(the value you have to set on donut graph).
LayoutToDisplayChartLeftGraph = (LinearLayout) findViewById(R.id.right_graph_for_punch_count);
Intent achartIntentLeft = new SingleDonutGraph().execute(TabletPunchCountActivity.this, LayoutToDisplayChartLeftGraph,graphValues);
Then use this class SingleDonutGraph.java
public class SingleDonutGraph {
private GraphicalView mChartView2;
static int count = 3;
int[] Mycolors = new int[] { Color.parseColor("#F2846B"),
Color.parseColor("#A01115"), Color.parseColor("#741E1E") };
String[] labels = { "TODAY", "AVERAGE", "TOTAL" };
public Intent execute(Context context, LinearLayout parent,double values[]) {
parent.removeAllViews();
int[] colors = new int[count];
for (int i = 0; i < count; i++) {
colors[i] = Mycolors[i];
}
DefaultRenderer renderer = buildCategoryRenderer(colors);
renderer.setShowLabels(false);
renderer.setBackgroundColor(Color.BLACK);
renderer.setPanEnabled(false);// Disable User Interaction
renderer.setScale((float) 1.4);
renderer.setInScroll(true); //To avoid scroll Shrink
renderer.setStartAngle(90);
renderer.setShowLegend(false);
MultipleCategorySeries categorySeries = new MultipleCategorySeries(
"Punch Graph");
categorySeries.add(labels, values);
mChartView2 = ChartFactory.getDoughnutChartView(context,
categorySeries, renderer);
parent.addView(mChartView2);
return ChartFactory.getDoughnutChartIntent(context, categorySeries,
renderer, null);
}
protected DefaultRenderer buildCategoryRenderer(int[] colors) {
DefaultRenderer renderer = new DefaultRenderer();
for (int color : colors) {
SimpleSeriesRenderer r = new SimpleSeriesRenderer();
r.setColor(color);
renderer.addSeriesRenderer(r);
}
return renderer;
}
}
Try this
may b it will help you
. Thanks!
This two lines makes the difference :
mChartView2 = ChartFactory.getDoughnutChartView(context,
categorySeries, renderer);
parent.addView(mChartView2);
return ChartFactory.getDoughnutChartIntent(context, categorySeries,
renderer, null);
I have an application that creates a bar chart based on Database values. In my main activity, I have this function:
public void onClick(View view){
BarGraph bar = new BarGraph();
bar.setCustomerCD(String.valueOf(spinner1.getSelectedItem()));
yagoDB.open();
ArrayList<String> stringList = yagoDB.getCustomerItem(String.valueOf(spinner1.getSelectedItem()));
String[] itemArray = new String[stringList.size()];
String[] returnedArray = stringList.toArray(itemArray);
bar.setItemCD(returnedArray);
bar.setMax(yagoDB.getQtyMax(String.valueOf(spinner1.getSelectedItem())));
bar.setItemCount(yagoDB.getItemCDCount(String.valueOf(spinner1.getSelectedItem())));
ArrayList<Integer> stringList2 = yagoDB.getCustomerQtyInt(String.valueOf(spinner1.getSelectedItem()));
yagoDB.close();
int[] returnedQty = convertIntegers(stringList2);
bar.setQty(returnedQty);
Intent barIntent = bar.getIntent(this);
startActivity(barIntent);
}
In this function, I'm basically creating an instance of my BarGraph class, initializing some of its variables, after which, I call its getIntent function. Here is the getIntent() function in the BarGraph class, the rest of the class contains setters and getters:
public Intent getIntent(Context context) {
int y[] = Qty;
CategorySeries series = new CategorySeries("Bar1");
for (int i = 0; i < y.length; i++) {
series.add("Bar" + (i + 1), y[i]);
}
// collection of series under one object, there could any number of series
XYMultipleSeriesDataset dataSet = new XYMultipleSeriesDataset();
dataSet.addSeries(series.toXYSeries());
// customization of the chart
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.BLUE);
renderer.setDisplayChartValues(true);
renderer.setChartValuesSpacing((float) 50d);
renderer.setChartValuesTextSize(30);
renderer.setLineWidth((float) 10.5d);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
mRenderer.setChartTitle("Sales for " + customerCD);
mRenderer.setXTitle("\n \n Item Codes");
mRenderer.setAxisTitleTextSize(30);
mRenderer.setChartTitleTextSize(30);
mRenderer.setLabelsTextSize(20);
mRenderer.setYTitle("\n\n\n\n\n\n\n Number of Orders");
mRenderer.setLabelsColor(Color.BLACK);
mRenderer.setZoomButtonsVisible(true);
mRenderer.setShowLegend(true);
mRenderer.setLegendTextSize(25);
mRenderer.setShowGridX(true); // this will show the grid in graph
mRenderer.setShowGridY(true);
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setGridColor(Color.BLACK);
mRenderer.setYLabelsColor(0, Color.BLACK);
mRenderer.setXLabelsColor(Color.BLACK);
mRenderer.setBarSpacing(.5);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.WHITE);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setXAxisMin(0);
mRenderer.setXAxisMax(itemCount + 1);
mRenderer.setXLabels(0);
mRenderer.setYAxisMin(0);
mRenderer.setYAxisMax(max+1);
//right, top, left, bottom
mRenderer.setMargins(new int[]{30,50,100,10});
mRenderer.setXLabelsPadding(10);
mRenderer.setYLabelsPadding(20);
for(int i = 0 ; i < ItemCD.length; i++){
mRenderer.addXTextLabel(i+1, ItemCD[i]);
}
mRenderer.setZoomEnabled(true, false);
//mRenderer.setClickEnabled(true);
mRenderer.setPanEnabled(true, false); // will fix the chart position
//xMin, xMax, yMin, yMax
mRenderer.setPanLimits(new double[]{0, itemCount + 1, 0, max + 1});
mRenderer.setOrientation(Orientation.VERTICAL);
Intent intent = ChartFactory.getBarChartIntent(context, dataSet,
mRenderer, Type.DEFAULT);
return intent;
}
I have googled examples and tutorials in how to and onClickListeners to a Graph generated by AChartEngine, but most of them involve generating the graph in the same class/activity. However, I noticed that the example that does not have to call an intent and I'm quite puzzled on how that worked.
Also, I had an issue where I set setClickEnabled() to true and it disabled setPanEnabled() from functioning properly.
So, several questions:
How do you add an onClickListener() on individual bars in a graph generated by AChartEngine?
Is there a way to enable setClickEnabled() and have it not conflict setPanEnabled()?
For the first question, see this example, starting at line #157.
For the second question, you can have them both enabled, but when you pan, the setOnClickListener will be running as well.
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:
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();
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()));
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
I am new to Graph concept in android. In my app i want implement the line graph using achartengine. I have the demo of achartengine it consists a lot of code. I am not able to understand the line graph. I want simple Line graph using achartengine. Please can anybody help me.
thanks
Following method will generate random points (x,y) and add it to XYSeries (it is series of points to be plotted on chart).
private XYMultipleSeriesDataset getDemoDataset() {
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
final int nr = 7;
Random r = new Random();
for (int i = 0; i < SERIES_NR; i++) {
XYSeries series = new XYSeries("Demo series " + (i + 1));
for (int k = 0; k < nr; k++) {
series.add(k, 20 + r.nextInt() % 100);
}
dataset.addSeries(series);
}
return dataset;
}
Following Method will return a multiple renderer which is used to draw line charts.
private XYMultipleSeriesRenderer getDemoRenderer() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setAxisTitleTextSize(12);
renderer.setChartTitleTextSize(12);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setMargins(new int[] { 20, 30, 15, 0 });
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.BLACK);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillBelowLine(false);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
setChartSettings(renderer);
return renderer;
}
Following method will set the settings for your chart. You can look for more options in docs provided by AChartEngine.
private void setChartSettings(XYMultipleSeriesRenderer renderer) {
renderer.setChartTitle("Chart demo");
renderer.setXTitle("x values");
renderer.setYTitle("y values");
renderer.setApplyBackgroundColor(false);
renderer.setRange(new double[] {0,6,-70,40});
renderer.setFitLegend(false);
renderer.setAxesColor(Color.BLACK);
renderer.setShowGrid(true);
renderer.setXAxisMin(0.5);
renderer.setXAxisMax(10.5);
renderer.setYAxisMin(0);
renderer.setZoomEnabled(false);
renderer.setYAxisMax(30);
}
You can now get the line chart in two ways:
Chart as a view which can be added to any layout:
ChartFactory.getLineChartView(this,
getDemoDataset(), getDemoRenderer());
Chart as an Intent for a new activity alltogether
ChartFactory.getLineChartIntent(this,
getDemoDataset(), getDemoRenderer());
PS: SERIES_NR is a constant which tells how many line series you want to draw.