Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GPL-compatible graphing library for Android

In a similar approach to this question, I am looking for a way to plot data points on to a view in Android. Preferably, a library which will do this for arbitrary-ranged input, as well as allow panning and zooming (via pinch or zoom bar).

Right now, I have subclass-ed a view which does the following normalization:

            final int width = View.MeasureSpec.getSize(this.widthMeasureSpec);
            final int height = View.MeasureSpec.getSize(this.heightMeasureSpec);
            final float factorA = width / (maxA - minA);
            final float factorS = height / (maxS - minS);
            final float constFactorA = factorA * minA;
            final float constFactorS = factorS * minS;
            final int dataLength = data.length;

            for (int i = 0; i < dataLength; ++i) {
                    if (i % 2 == 0)
                            _data[i] = _data[i] * factorA - constFactorA;
                    else
                            _data[i] = _data[i] * factorS - constFactorS;
            }

and a call in onDraw() to the drawPoints method of a canvas (also, I update this.widthMeasureSpec and this.heightMeasureSpec in onMeasure()).

This is with minA/maxA as the bounds for my independent variable and minS/maxS as the bounds for my dependent variable.

This works fine for displaying the data, but I am hoping someone else has solved the problem of drawing the axes and panning/zooming.

I have ~150,000 data points, and I would prefer to keep these as floats to save half the memory. I don't know how big decimal numbers are in JavaScript, but I really don't want to resort to passing data in through JavaScript for the Google Charts API or an HTML-based solution for memory's sake.

I'm running this on a MyTouch 3g (the original, before 3.5mm jack and it's RAM upgrade), so performance is an issue. I'd like to release the final project under the GPLv3, so this excludes GraphView.

The graphs are of the same type as this, so any optimization by excluding points that are too close together to show up on screen would definitely make a difference.

like image 230
sargas Avatar asked Apr 29 '26 07:04

sargas


2 Answers

sargas , do check android-misc-widgets.It contains a widget named PlotView with an example TestInterPolator.

Hope it helps.

like image 107
100rabh Avatar answered May 03 '26 11:05

100rabh


Original post: Chart and Graph Library for Android

With the library GraphView it's possible to create a line and bar graphs.

GraphView is a library for Android to programmatically create flexible and nice-looking line and bar diagramms. It is easy to understand, to integrate and to customize it.

First checkout the library and integrate it into your project. Source code is hosted on github. GraphView library on github

It's also possible to let the graph be scalable (zooming) and scrollable. More information about this library on Original post: Chart and Graph Library for Android

This is how it will look like: line graph

Then you can easily create it with a few lines of code (see snippet):

// graph with dynamically genereated horizontal and vertical labels
GraphView graphView = new LineGraphView(
  this // context
  , new GraphViewData[] {
    new GraphViewData(1, 2.0d)
    , new GraphViewData(2, 1.5d)
    , new GraphViewData(2.5, 3.0d) // another frequency
    , new GraphViewData(3, 2.5d)
    , new GraphViewData(4, 1.0d)
    , new GraphViewData(5, 3.0d)
  } // data
  , "GraphViewDemo" // heading
  , null // dynamic labels
  , null // dynamic labels
);
LinearLayout layout = (LinearLayout) findViewById(R.id.graph1);
layout.addView(graphView);
like image 32
appsthatmatter Avatar answered May 03 '26 11:05

appsthatmatter



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!