Rezaul Hoque
Rezaul Hoque

Reputation: 109

Unable to draw multiple series in achartengine

I am unable to plot multiple series in achartengine. If I add a second series to the dataset, then it just doesn't work, it crashes actually. With only one series added to the dataset, the code works fine.

Debugging shows, that it crashes when here when doing this : ChartFactory.getLineChartView(context, dataset, seriesRenderer);

Here is the code snippet, any help would be greatly appreciated.

public class LineGraph {

public View getView(Context context) {

    int x[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    int y[] = {30,34,25,45,5,30,20,25,29,30,10,20,30,40,50,60,70,60,50,40};     

    TimeSeries series = new TimeSeries("Scores");
    TimeSeries lineSeries = new TimeSeries("Line");

    for(int i=0;i<x.length;i++) {
        series.add(x[i], y[i]);
        series.addAnnotation(i + "", x[i], y[i]+5);

        lineSeries.add(x[i], y[i]+10);
    }

    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    dataset.addSeries(series);
    dataset.addSeries(lineSeries);

    XYSeriesRenderer renderer = new XYSeriesRenderer();
    renderer.setPointStyle(PointStyle.CIRCLE);
    renderer.setFillPoints(true);
    renderer.setColor(Color.WHITE);
    renderer.setLineWidth(2f);

    XYMultipleSeriesRenderer seriesRenderer = new XYMultipleSeriesRenderer();
    seriesRenderer.addSeriesRenderer(renderer);
    seriesRenderer.setShowAxes(false); // show both axes
    seriesRenderer.setShowLegend(false);
    seriesRenderer.setShowLabels(false);
    seriesRenderer.setZoomButtonsVisible(false); // bye bye zoom  

    //seriesRenderer.setMargins(new int[] {1, 1, 1, 10});

    seriesRenderer.setXAxisMin(0);
    seriesRenderer.setXAxisMax(10);

    seriesRenderer.setTextTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Lifestyle Rounded M54.ttf"));
    seriesRenderer.setPointSize(10f);
    seriesRenderer.setPanEnabled(true, false);
    seriesRenderer.setGridColor(Color.GRAY);


    View view = ChartFactory.getLineChartView(context, dataset, seriesRenderer);

    return view;
}

}

And here is how I am using it :

public class PerformanceActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_performance);
    Utils.overrideFonts(this, findViewById(android.R.id.content));

    LineGraph lineGraph = new LineGraph();
    View graphView = lineGraph.getView(getApplicationContext());

    RelativeLayout graphHolder = (RelativeLayout)findViewById(R.id.rl_graph);
    graphHolder.addView(graphView);     
}

Upvotes: 1

Views: 1878

Answers (2)

Raghunandan
Raghunandan

Reputation: 133560

You are missing second renderer.

public class LineGraph {

    public Intent getIntent(Context context)
    {

    int x[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    int y[] = {30,34,25,45,5,30,20,25,29,30,10,20,30,40,50,60,70,60,50,40};     

    TimeSeries series = new TimeSeries("Scores");
    TimeSeries lineSeries = new TimeSeries("Line");

    for(int i=0;i<x.length;i++) {
        series.add(x[i], y[i]);
        //series.addAnnotation(i + "", x[i], y[i]+5);

        lineSeries.add(x[i], y[i]+10);
    }

    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    dataset.addSeries(series);
    dataset.addSeries(lineSeries);

    XYSeriesRenderer renderer = new XYSeriesRenderer();
    renderer.setPointStyle(PointStyle.CIRCLE);
    renderer.setFillPoints(true);
    renderer.setColor(Color.BLACK);
    renderer.setLineWidth(2f);

    XYSeriesRenderer renderer2= new XYSeriesRenderer();//renderer for 2
    // missing renderer 2    
    renderer2.setColor(Color.GREEN);
    renderer2.setFillPoints(true);
    //renderer2.setChartValuesSpacing(1f);
    renderer.setLineWidth(2f);

    XYMultipleSeriesRenderer seriesRenderer = new XYMultipleSeriesRenderer();
    seriesRenderer.addSeriesRenderer(renderer);
    seriesRenderer.addSeriesRenderer(renderer2); 
    seriesRenderer.setShowAxes(false); // show both axes
    seriesRenderer.setShowLegend(false);
    seriesRenderer.setShowLabels(false);
    seriesRenderer.setZoomButtonsVisible(false); 
    Intent  intent= ChartFactory.getLineChartIntent(context, dataset, seriesRenderer);
    return intent;
    }
}

snap shot

enter image description here

Edit:

XYMultipleSeriesRenderer seriesRenderer = new XYMultipleSeriesRenderer();
seriesRenderer.addSeriesRenderer(renderer);
seriesRenderer.addSeriesRenderer(renderer2); 
seriesRenderer.setChartTitle("Line Graph");
seriesRenderer.setXTitle("X Values");
seriesRenderer.setYTitle("Y values");
seriesRenderer.setBarSpacing(10);
seriesRenderer.setZoomEnabled(true); 

enter image description here

Upvotes: 7

Sam Dozor
Sam Dozor

Reputation: 40734

You need to add a series renderer for each series, you've only added a single renderer. Add a 2nd and you should be good to go.

Upvotes: 3

Related Questions