Drawing bar graph with achartengine - android

I am trying to generate a bar chart using achartengine . Bu I am getting error.
And my code is :
public GraphicalView getGraph(String[] labels,double[] values){
CategorySeries series = new CategorySeries(null);
for(int i = 0 ; i < labels.length ;i++){
series.add(labels[i], values[i]);
}
XYSeries mSeries = series.toXYSeries();
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(mSeries);
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setAxesColor(Color.BLUE);
renderer.setBackgroundColor(Color.GREEN);
renderer.setChartTitle("Exa");
SimpleSeriesRenderer sRenderer = new SimpleSeriesRenderer();
sRenderer.setColor(Color.BLUE);
renderer.addSeriesRenderer(sRenderer);
GraphicalView v = ChartFactory.getBarChartView(context, dataset, renderer,Type.DEFAULT);
return v;
}
What is wrong in this code?

There is another library available which is more simple than achartengine. HoloGraphLibrary
Thank you

Related

Dynamic line chart using Achartengine is not working

I am making dynamic line chart using Achartengine and this is working on static data but not working on dynamic data.Actual,plan and month is dynamic.I want to create line chart based on the values of actual,plan and month.I am using below code.
private void drawChart() {
XYSeries actualSeries = new XYSeries("Actual");
// Creating an XYSeries for Expense<br />
XYSeries planSeries = new XYSeries("Plan");
// Adding data to Income and Expense Series
for (int i = 0; i <actualList.size; i++) {
actualSeries.add(i,Double.parseDouble(actualList.get(i)));
planSeries.add(i,Double.parseDouble(planList.get(i)));
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset xyMultipleSeriesDataset = new XYMultipleSeriesDataset();
// Adding Income Series to the dataset
xyMultipleSeriesDataset.addSeries(actualSeries);
// Adding Expense Series to dataset
xyMultipleSeriesDataset.addSeries(planSeries);
XYSeriesRenderer actualRenderer = new XYSeriesRenderer();
actualRenderer.setColor(Color.GREEN);
actualRenderer.setPointStyle(PointStyle.CIRCLE);
actualRenderer.setFillPoints(true);
actualRenderer.setLineWidth(2);
actualRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer planRenderer = new XYSeriesRenderer();
planRenderer.setColor(Color.RED);
planRenderer.setPointStyle(PointStyle.CIRCLE);
planRenderer.setFillPoints(true);
planRenderer.setLineWidth(2);
planRenderer.setDisplayChartValues(true);
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setApplyBackgroundColor(true);
multiRenderer.setBackgroundColor(Color.WHITE);
multiRenderer.setMarginsColor(Color.WHITE);
multiRenderer.setLabelsColor(Color.RED);
multiRenderer.setPanEnabled(false, false);
/* multiRenderer.setYLabels(5);
multiRenderer.setXLabels(1);
*/ multiRenderer.setXLabelsColor(Color.BLACK);
multiRenderer.setYLabelsColor(0, Color.BLACK);
//* multiRenderer.setShowGridX(true);
//multiRenderer.setShowGridY(true)
multiRenderer.setGridColor(Color.BLACK);
multiRenderer.setChartTitle("Plan vs Actual Curve");
multiRenderer.setXTitle("Months");
multiRenderer.setYTitle("plan/actual");
multiRenderer.setZoomButtonsVisible(false);
for (int i = 0; i < monthList.size(); i++) {
multiRenderer.addXTextLabel(i + 1, monthList.get(i).toString());
}
multiRenderer.addSeriesRenderer(actualRenderer);
multiRenderer.addSeriesRenderer(planRenderer);
// Getting a reference to LinearLayout of the MainActivity Layout<br />
LinearLayout chartContainer = (LinearLayout) mView.findViewById(R.id.chart_container);
// Creating a Line Chart<br />
GraphicalView chart = ChartFactory.getLineChartView(getActivity(), xyMultipleSeriesDataset, multiRenderer);
chartContainer.addView(chart);
if (chart != null) {
chartContainer.removeView(chart);
chart.repaint();
}
}
Thanks in advance
I have solved my question myself after doing some research.The problem was UI update problem.Once the chart is plotted then for new data we have to remove that view and should create new chart view based on data.Below is the working code.
private void drawChart() {
// Creating an XYSeries for Income
XYSeries actualSeries = new XYSeries("Actual");
// Creating an XYSeries for Expense<br />
XYSeries planSeries = new XYSeries("Plan");
XYSeries cupOneSeries = new XYSeries("Cup1");
XYSeries cupTwoSeries = new XYSeries("Cup2");
XYSeries cupThreeSeries = new XYSeries("Cup3");
// Adding data to Income and Expense Series
Log.e("x axis value in curve", "" + xAxisValueList.size());
Log.e("size of Actual", actualList.size() + "");
Log.e("size of plan", planList.size() + "");
for (int i = 0; i < actualList.size(); i++) {
actualSeries.add(i, Math.round(Double.parseDouble(actualList.get(i))));
planSeries.add(i, Math.round(Double.parseDouble(planList.get(i))));
cupOneSeries.add(i, Math.round(Double.parseDouble(cupOneList.get(i))));
cupTwoSeries.add(i, Math.round(Double.parseDouble(cupTwoList.get(i))));
cupThreeSeries.add(i, Math.round(Double.parseDouble(cupThreeList.get(i))));
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset xyMultipleSeriesDataset = new XYMultipleSeriesDataset();
// Adding Income Series to the dataset
xyMultipleSeriesDataset.addSeries(actualSeries);
// Adding Expense Series to dataset
xyMultipleSeriesDataset.addSeries(planSeries);
xyMultipleSeriesDataset.addSeries(cupOneSeries);
xyMultipleSeriesDataset.addSeries(cupTwoSeries);
xyMultipleSeriesDataset.addSeries(cupThreeSeries);
XYSeriesRenderer actualRenderer = new XYSeriesRenderer();
actualRenderer.setColor(getActivity().getResources().getColor(R.color.logo_blue));
actualRenderer.setPointStyle(PointStyle.CIRCLE);
actualRenderer.setFillPoints(true);
actualRenderer.setLineWidth(2);
actualRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer planRenderer = new XYSeriesRenderer();
planRenderer.setColor(getActivity().getResources().getColor(R.color.logo_orange));
planRenderer.setPointStyle(PointStyle.CIRCLE);
planRenderer.setFillPoints(true);
planRenderer.setLineWidth(2);
planRenderer.setDisplayChartValues(true);
XYSeriesRenderer cupOneRenderer = new XYSeriesRenderer();
cupOneRenderer.setColor(getActivity().getResources().getColor(R.color.black));
cupOneRenderer.setPointStyle(PointStyle.CIRCLE);
cupOneRenderer.setFillPoints(true);
cupOneRenderer.setLineWidth(2);
cupOneRenderer.setDisplayChartValues(true);
XYSeriesRenderer cupTwoRenderer = new XYSeriesRenderer();
cupTwoRenderer.setColor(getActivity().getResources().getColor(R.color.green));
cupTwoRenderer.setPointStyle(PointStyle.CIRCLE);
cupTwoRenderer.setFillPoints(true);
cupTwoRenderer.setLineWidth(2);
cupTwoRenderer.setDisplayChartValues(true);
XYSeriesRenderer cupThreeRenderer = new XYSeriesRenderer();
cupThreeRenderer.setColor(Color.parseColor("#0D8ECF"));
cupThreeRenderer.setPointStyle(PointStyle.CIRCLE);
cupThreeRenderer.setFillPoints(true);
cupThreeRenderer.setLineWidth(2);
cupThreeRenderer.setDisplayChartValues(true);
// Creating a XYMultipleSeriesRenderer to customize the whole chart<br />
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setApplyBackgroundColor(true);
multiRenderer.setBackgroundColor(Color.WHITE);
multiRenderer.setMarginsColor(Color.WHITE);
multiRenderer.setLabelsColor(Color.RED);
multiRenderer.setPanEnabled(true,false);
/* multiRenderer.setLabelsTextSize(getActivity().getResources().getDimensionPixelSize(R.dimen.sp_9));
multiRenderer.setLegendTextSize(getActivity().getResources().getDimensionPixelSize(R.dimen.sp_9));
*/ multiRenderer.setChartValuesTextSize(getActivity().getResources().getDimensionPixelSize(R.dimen.sp_9));
multiRenderer.setXLabelsColor(Color.BLACK);
multiRenderer.setYLabelsColor(0, Color.BLACK);
multiRenderer.setShowGridX(true);
multiRenderer.setShowGridY(true);
multiRenderer.setGridColor(Color.BLACK);
multiRenderer.setChartTitle("Plan vs Actual Curve");
multiRenderer.setXTitle("Months");
multiRenderer.setYTitle("plan/actual");
multiRenderer.setZoomButtonsVisible(false);
multiRenderer.setZoomEnabled(true);
for (int i = 0; i < monthList.size(); i++) {
multiRenderer.addXTextLabel(i, monthList.get(i).toString());
}
multiRenderer.addSeriesRenderer(actualRenderer);
multiRenderer.addSeriesRenderer(planRenderer);
multiRenderer.addSeriesRenderer(cupOneRenderer);
multiRenderer.addSeriesRenderer(cupTwoRenderer);
multiRenderer.addSeriesRenderer(cupThreeRenderer);
Log.e("size of actual log",actualList.size()+"");
LinearLayout chartContainer = (LinearLayout) mView.findViewById(R.id.chart_container);
if (monthList.size() > 0) {
// Getting a reference to LinearLayout of the MainActivity Layout<br />
chartContainer.removeAllViews();
//drawing bar chart<br />
chart = ChartFactory.getLineChartView(getActivity(), xyMultipleSeriesDataset, multiRenderer);
//adding the view to the linearlayout<br />
chartContainer.addView(chart);
} else {
chartContainer.removeAllViews();
CustomToast.initToast(getActivity(),"No data available for S-curve");
}
}

How to remove space between bars in achart engine Android

Hi, please help me to remove space between bars in chart and set
bars very close. have tried many ways. Anyone have solution,
please suggest me.Thanks in advance.The following is my code.
void drawChart(String[] items, float[] amount){
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
XYSeries[] qtySeries = new XYSeries[amount.length];
XYSeriesRenderer[] qtyRenderer = new XYSeriesRenderer[amount.length];
for(int i=0;i<amount.length ;i++){
qtySeries[i] = new XYSeries("");
qtySeries[i].add(i,amount[i]);
dataset.addSeries(qtySeries[i]);
qtyRenderer[i] = new XYSeriesRenderer();
qtyRenderer[i].setColor(color[i]);
qtyRenderer[i].setDisplayChartValues(true);
qtyRenderer[i].setChartValuesTextSize(15);
qtyRenderer[i].setChartValuesSpacing(22);
mRenderer.addSeriesRenderer(qtyRenderer[i]);
mRenderer.addXTextLabel(i+1, items[i]);
}
float max=amount[0];
for (int i = 0; i < amount.length; i++) {
if (amount[i] > max) {
max = amount[i];
}
}
mRenderer.setYAxisMax(max + 20);
mRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.VERTICAL);
mRenderer.setBarWidth(40f);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setBarSpacing(0.5);
mRenderer.setShowLegend(false);
mRenderer.setPanEnabled(true, false);
mRenderer.setZoomEnabled(false,false);
mRenderer.setXLabelsColor(Color.WHITE);
mRenderer.setYLabelsColor(0,Color.WHITE);
mRenderer.setXLabelsPadding(0.0f);
mRenderer.setYAxisMin(0);
mRenderer.setBarSpacing(0.0f);
lLytHourlyChart.removeAllViews();
lLytHourlyChart.addView(ChartFactory.getBarChartView(getActivity(), dataset, mRenderer, BarChart.Type.DEFAULT));
}
add bar spacing
mRenderer.setBarSpacing(-1);

Making Concentric Pie Chart in Android

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

achartengine multiple lines in one linegraph

I am trying to make two lines appear in a graph according to this video:
http://www.youtube.com/watch?v=5DGldVzC-bU
My code:
public class LineGraph {
public Intent getIntent(Context context){
int[] x = {1,2,3,4,5,6,7,8,9,10};
int[] y = {31,29,54,94,75,36,47,118,92,10};
TimeSeries series = new TimeSeries("Line1");
for (int i=0;i<x.length;i++){
series.add(x[i],y[i]);
}
int[] x2 = {1,2,3,4,5,6,7,8,9,10};
int[] y2 = {39,145,35,87,2,65,48,49,100,106};
TimeSeries series2 = new TimeSeries("Line2");
for (int i=0;i<x2.length;i++){
series.add(x2[i],y2[i]);
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(series);
dataset.addSeries(series2);
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.CYAN);
renderer.setPointStyle(PointStyle.SQUARE);
renderer.setFillPoints(true);
renderer.setLineWidth(3);
renderer.setDisplayChartValues(true);
XYSeriesRenderer renderer2 = new XYSeriesRenderer();
renderer2.setColor(Color.BLACK);
renderer2.setPointStyle(PointStyle.CIRCLE);
renderer2.setFillPoints(true);
renderer2.setLineWidth(3);
renderer2.setDisplayChartValues(true);
XYMultipleSeriesRenderer mrenderer = new XYMultipleSeriesRenderer();
mrenderer.addSeriesRenderer(renderer);
mrenderer.addSeriesRenderer(renderer2);
mrenderer.setChartTitle("title");
mrenderer.setBackgroundColor(Color.WHITE);
mrenderer.setShowGrid(true);
mrenderer.setApplyBackgroundColor(true);
mrenderer.setXTitle("Days");
mrenderer.setYTitle("datas");
mrenderer.setGridColor(Color.GRAY);
// mrenderer.setZoomButtonsVisible(true);
Intent intent = ChartFactory.getLineChartIntent(context, dataset, mrenderer, "Line graph title");
return intent;
}
Practically the same as in the video. But my doesnt work, instead of getting two different lines, I get only one. When the last data of the first line (x) ends it goes to the first data of the second line (x2), so the second line continues from the first one.
Thanks in advance!
Shouldn't the following:
series.add(x2[i],y2[i]);
be actually:
series2.add(x2[i],y2[i]);
Note the '2'.
TimeSeries series = new TimeSeries("Line1");
for (int i=0;i<x.length;i++){
series.add(x[i],y[i]);
}
int[] x2 = {1,2,3,4,5,6,7,8,9,10};
int[] y2 = {39,145,35,87,2,65,48,49,100,106};
TimeSeries series2 = new TimeSeries("Line2");
for (int i=0;i<x2.length;i++){
series2.add(x2[i],y2[i]); // The change is here...
}

android - How to implement the Line Graph using Achartengine

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.

Categories

Resources