Search in sources :

Example 11 with XYSeries

use of org.achartengine.model.XYSeries in project AndrOBD by fr3ts0n.

the class ChartActivity method setUpChartData.

/**
 * Set up all the charting data series
 *
 * @param positions Positions of PIDs withn adapter
 */
private void setUpChartData(int[] positions) {
    long startTime = System.currentTimeMillis();
    int i = 0;
    EcuDataPv currPv;
    XYSeries currSeries;
    pidNumbers.clear();
    // loop through all PIDs
    for (int position : positions) {
        // get corresponding Process variable
        currPv = (EcuDataPv) mAdapter.getItem(position);
        if (currPv == null)
            continue;
        int pid = currPv.getAsInt(EcuDataPv.FID_PID);
        // add PID to unique list of PIDs
        pidNumbers.add(pid);
        // get contained data series
        currSeries = (XYSeries) currPv.get(ObdItemAdapter.FID_DATA_SERIES);
        if (currSeries == null)
            continue;
        // at least one measurement is available
        if (currSeries.getItemCount() < 1)
            currSeries.add(startTime, (Float) currPv.get(EcuDataPv.FID_VALUE));
        // set scale to display series
        currSeries.setScaleNumber(i);
        // register series to graph
        sensorData.addSeries(i, currSeries);
        /* set up series visual parameters */
        renderer.setYTitle(String.valueOf(currPv.get(EcuDataPv.FID_UNITS)), i);
        renderer.setYAxisAlign(((i % 2) == 0) ? Align.LEFT : Align.RIGHT, i);
        renderer.setYLabelsAlign(((i % 2) == 0) ? Align.LEFT : Align.RIGHT, i);
        renderer.setYLabelsColor(i, getItemColor(pid));
        /* set up new line renderer */
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(getItemColor(pid));
        r.setStroke(getStroke(pid));
        // register line renderer
        renderer.addSeriesRenderer(i, r);
        i++;
    }
}
Also used : XYSeries(org.achartengine.model.XYSeries) EcuDataPv(com.fr3ts0n.ecu.EcuDataPv) XYSeriesRenderer(org.achartengine.renderer.XYSeriesRenderer)

Example 12 with XYSeries

use of org.achartengine.model.XYSeries in project netxms by netxms.

the class DrawBarChart method buildDataset.

/**
 * @return
 */
private XYMultipleSeriesDataset buildDataset() {
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    for (int i = 0; i < items.length; i++) {
        XYSeries series = new XYSeries(items[i].getDescription());
        for (int j = 0; j < items.length; j++) {
            series.add(j + 1, (i == j) ? values[i] : 0);
        }
        dataset.addSeries(series);
    }
    return dataset;
}
Also used : XYSeries(org.achartengine.model.XYSeries) XYMultipleSeriesDataset(org.achartengine.model.XYMultipleSeriesDataset)

Example 13 with XYSeries

use of org.achartengine.model.XYSeries in project netxms by netxms.

the class TableBarChartElement method refresh.

/* (non-Javadoc)
	 * @see org.netxms.ui.android.main.dashboards.elements.AbstractDashboardElement#refresh()
	 */
@Override
public void refresh() {
    try {
        final Table data = service.getSession().getTableLastValues(config.getNodeId(), config.getDciId());
        post(new Runnable() {

            @Override
            public void run() {
                // FIXME
                String instanceColumn = (config.getInstanceColumn() != null) ? config.getInstanceColumn() : "";
                if (instanceColumn == null)
                    return;
                int icIndex = data.getColumnIndex(instanceColumn);
                int dcIndex = data.getColumnIndex(config.getDataColumn());
                if ((icIndex == -1) || (dcIndex == -1))
                    // at least one column is missing
                    return;
                XYMultipleSeriesDataset dataset = chart.getDataset();
                for (int i = 0; i < data.getRowCount(); i++) {
                    String instance = data.getCell(i, icIndex).getValue();
                    if (instance == null)
                        continue;
                    double value;
                    try {
                        value = Double.parseDouble(data.getCell(i, dcIndex).getValue());
                    } catch (NumberFormatException e) {
                        value = 0.0;
                    }
                    Integer index = instanceMap.get(instance);
                    if (config.isIgnoreZeroValues() && (value == 0) && (index == null))
                        continue;
                    XYSeries series = new XYSeries(instance);
                    if (index != null) {
                        dataset.removeSeries(index);
                    } else {
                        index = dataset.getSeriesCount();
                        instanceMap.put(instance, index);
                    }
                    for (int j = 0; j < instanceMap.size(); j++) {
                        series.add(j + 1, (index == j) ? value : 0);
                    }
                    dataset.addSeries(index, series);
                }
                renderer.setXAxisMax(dataset.getSeriesCount() + 0.5);
                chartView.repaint();
            }
        });
    } catch (Exception e) {
        Log.e("nxclient/BarChartElement", "Exception while reading data from server", e);
    }
}
Also used : XYSeries(org.achartengine.model.XYSeries) Table(org.netxms.client.Table) XYMultipleSeriesDataset(org.achartengine.model.XYMultipleSeriesDataset)

Example 14 with XYSeries

use of org.achartengine.model.XYSeries in project sensorreadout by onyxbits.

the class TimeChart method getXLabels.

@Override
protected List<Double> getXLabels(double min, double max, int count) {
    final List<Double> result = new ArrayList<Double>();
    if (!mRenderer.isXRoundedLabels()) {
        if (mDataset.getSeriesCount() > 0) {
            XYSeries series = mDataset.getSeriesAt(0);
            int length = series.getItemCount();
            int intervalLength = 0;
            int startIndex = -1;
            for (int i = 0; i < length; i++) {
                double value = series.getX(i);
                if (min <= value && value <= max) {
                    intervalLength++;
                    if (startIndex < 0) {
                        startIndex = i;
                    }
                }
            }
            if (intervalLength < count) {
                for (int i = startIndex; i < startIndex + intervalLength; i++) {
                    result.add(series.getX(i));
                }
            } else {
                float step = (float) intervalLength / count;
                int intervalCount = 0;
                for (int i = 0; i < length && intervalCount < count; i++) {
                    double value = series.getX(Math.round(i * step));
                    if (min <= value && value <= max) {
                        result.add(value);
                        intervalCount++;
                    }
                }
            }
            return result;
        } else {
            return super.getXLabels(min, max, count);
        }
    }
    if (mStartPoint == null) {
        mStartPoint = min - (min % DAY) + DAY + new Date(Math.round(min)).getTimezoneOffset() * 60 * 1000;
    }
    if (count > 25) {
        count = 25;
    }
    final double cycleMath = (max - min) / count;
    if (cycleMath <= 0) {
        return result;
    }
    double cycle = DAY;
    if (cycleMath <= DAY) {
        while (cycleMath < cycle / 2) {
            cycle = cycle / 2;
        }
    } else {
        while (cycleMath > cycle) {
            cycle = cycle * 2;
        }
    }
    double val = mStartPoint - Math.floor((mStartPoint - min) / cycle) * cycle;
    int i = 0;
    while (val < max && i++ <= count) {
        result.add(val);
        val += cycle;
    }
    return result;
}
Also used : XYSeries(org.achartengine.model.XYSeries) ArrayList(java.util.ArrayList) Paint(android.graphics.Paint) Date(java.util.Date)

Example 15 with XYSeries

use of org.achartengine.model.XYSeries in project Anki-Android by Ramblurr.

the class XYChart method draw.

/**
 * The graphical representation of the XY chart.
 *
 * @param canvas the canvas to paint to
 * @param x the top left x value of the view to draw to
 * @param y the top left y value of the view to draw to
 * @param width the width of the view to draw to
 * @param height the height of the view to draw to
 * @param paint the paint
 */
public void draw(Canvas canvas, int x, int y, int width, int height, Paint paint) {
    paint.setAntiAlias(mRenderer.isAntialiasing());
    int legendSize = getLegendSize(mRenderer, height / 5, mRenderer.getAxisTitleTextSize());
    int[] margins = mRenderer.getMargins();
    int left = x + margins[1];
    int top = y + margins[0];
    int right = x + width - margins[3];
    int sLength = mDataset.getSeriesCount();
    String[] titles = new String[sLength];
    for (int i = 0; i < sLength; i++) {
        titles[i] = mDataset.getSeriesAt(i).getTitle();
    }
    if (mRenderer.isFitLegend() && mRenderer.isShowLegend()) {
        legendSize = drawLegend(canvas, mRenderer, titles, left, right, y, width, height, legendSize, paint, true);
    }
    int bottom = y + height - margins[2] - legendSize;
    if (mScreenR == null) {
        mScreenR = new Rect();
    }
    mScreenR.set(left, top, right, bottom);
    drawBackground(mRenderer, canvas, x, y, width, height, paint, false, DefaultRenderer.NO_COLOR);
    if (paint.getTypeface() == null || !paint.getTypeface().toString().equals(mRenderer.getTextTypefaceName()) || paint.getTypeface().getStyle() != mRenderer.getTextTypefaceStyle()) {
        paint.setTypeface(Typeface.create(mRenderer.getTextTypefaceName(), mRenderer.getTextTypefaceStyle()));
    }
    Orientation or = mRenderer.getOrientation();
    if (or == Orientation.VERTICAL) {
        right -= legendSize;
        bottom += legendSize - 20;
    }
    int angle = or.getAngle();
    boolean rotate = angle == 90;
    mScale = (float) (height) / width;
    mTranslate = Math.abs(width - height) / 2;
    if (mScale < 1) {
        mTranslate *= -1;
    }
    mCenter = new Point((x + width) / 2, (y + height) / 2);
    if (rotate) {
        transform(canvas, angle, false);
    }
    int maxScaleNumber = -Integer.MAX_VALUE;
    for (int i = 0; i < sLength; i++) {
        maxScaleNumber = Math.max(maxScaleNumber, mDataset.getSeriesAt(i).getScaleNumber());
    }
    maxScaleNumber++;
    if (maxScaleNumber < 0) {
        return;
    }
    double[] minX = new double[maxScaleNumber];
    double[] maxX = new double[maxScaleNumber];
    double[] minY = new double[maxScaleNumber];
    double[] maxY = new double[maxScaleNumber];
    boolean[] isMinXSet = new boolean[maxScaleNumber];
    boolean[] isMaxXSet = new boolean[maxScaleNumber];
    boolean[] isMinYSet = new boolean[maxScaleNumber];
    boolean[] isMaxYSet = new boolean[maxScaleNumber];
    for (int i = 0; i < maxScaleNumber; i++) {
        minX[i] = mRenderer.getXAxisMin(i);
        maxX[i] = mRenderer.getXAxisMax(i);
        minY[i] = mRenderer.getYAxisMin(i);
        maxY[i] = mRenderer.getYAxisMax(i);
        isMinXSet[i] = mRenderer.isMinXSet(i);
        isMaxXSet[i] = mRenderer.isMaxXSet(i);
        isMinYSet[i] = mRenderer.isMinYSet(i);
        isMaxYSet[i] = mRenderer.isMaxYSet(i);
        if (mCalcRange.get(i) == null) {
            mCalcRange.put(i, new double[4]);
        }
    }
    double[] xPixelsPerUnit = new double[maxScaleNumber];
    double[] yPixelsPerUnit = new double[maxScaleNumber];
    for (int i = 0; i < sLength; i++) {
        XYSeries series = mDataset.getSeriesAt(i);
        int scale = series.getScaleNumber();
        if (series.getItemCount() == 0) {
            continue;
        }
        if (!isMinXSet[scale]) {
            double minimumX = series.getMinX();
            minX[scale] = Math.min(minX[scale], minimumX);
            mCalcRange.get(scale)[0] = minX[scale];
        }
        if (!isMaxXSet[scale]) {
            double maximumX = series.getMaxX();
            maxX[scale] = Math.max(maxX[scale], maximumX);
            mCalcRange.get(scale)[1] = maxX[scale];
        }
        if (!isMinYSet[scale]) {
            double minimumY = series.getMinY();
            minY[scale] = Math.min(minY[scale], (float) minimumY);
            mCalcRange.get(scale)[2] = minY[scale];
        }
        if (!isMaxYSet[scale]) {
            double maximumY = series.getMaxY();
            maxY[scale] = Math.max(maxY[scale], (float) maximumY);
            mCalcRange.get(scale)[3] = maxY[scale];
        }
    }
    for (int i = 0; i < maxScaleNumber; i++) {
        if (maxX[i] - minX[i] != 0) {
            xPixelsPerUnit[i] = (right - left) / (maxX[i] - minX[i]);
        }
        if (maxY[i] - minY[i] != 0) {
            yPixelsPerUnit[i] = (float) ((bottom - top) / (maxY[i] - minY[i]));
        }
    }
    boolean hasValues = false;
    // use a linked list for these reasons:
    // 1) Avoid a large contiguous memory allocation
    // 2) We don't need random seeking, only sequential reading/writing, so
    // linked list makes sense
    clickableAreas = new HashMap<Integer, List<ClickableArea>>();
    for (int i = 0; i < sLength; i++) {
        XYSeries series = mDataset.getSeriesAt(i);
        int scale = series.getScaleNumber();
        if (series.getItemCount() == 0) {
            continue;
        }
        hasValues = true;
        SimpleSeriesRenderer seriesRenderer = mRenderer.getSeriesRendererAt(i);
        // int originalValuesLength = series.getItemCount();
        // int valuesLength = originalValuesLength;
        // int length = valuesLength * 2;
        List<Float> points = new ArrayList<Float>();
        List<Double> values = new ArrayList<Double>();
        float yAxisValue = Math.min(bottom, (float) (bottom + yPixelsPerUnit[scale] * minY[scale]));
        LinkedList<ClickableArea> clickableArea = new LinkedList<ClickableArea>();
        clickableAreas.put(i, clickableArea);
        SortedMap<Double, Double> range = series.getRange(minX[scale], maxX[scale], 1);
        int startIndex = -1;
        int intRange = range.lastKey().intValue() - range.firstKey().intValue();
        for (Entry<Double, Double> value : range.entrySet()) {
            double xValue = value.getKey();
            double yValue = value.getValue();
            if (startIndex < 0) {
                startIndex = series.getIndexForKey(xValue);
            }
            // points.add((float) (left + xPixelsPerUnit[scale]
            // * (value.getKey().floatValue() - minX[scale])));
            // points.add((float) (bottom - yPixelsPerUnit[scale]
            // * (value.getValue().floatValue() - minY[scale])));
            values.add(value.getKey());
            values.add(value.getValue());
            if (!isNullValue(yValue)) {
                points.add((float) (left + xPixelsPerUnit[scale] * (xValue - minX[scale])));
                points.add((float) (bottom - yPixelsPerUnit[scale] * (yValue - minY[scale])));
            } else if (isRenderNullValues()) {
                points.add((float) (left + xPixelsPerUnit[scale] * (xValue - minX[scale])));
                points.add((float) (bottom - yPixelsPerUnit[scale] * (-minY[scale])));
            } else {
                if (points.size() > 0) {
                    drawSeries(series, canvas, paint, points, seriesRenderer, yAxisValue, i, or, startIndex, intRange);
                    ClickableArea[] clickableAreasForSubSeries = clickableAreasForPoints(MathHelper.getFloats(points), MathHelper.getDoubles(values), yAxisValue, i, startIndex, intRange);
                    clickableArea.addAll(Arrays.asList(clickableAreasForSubSeries));
                    points.clear();
                    values.clear();
                }
                clickableArea.add(null);
            }
        }
        if (points.size() > 0) {
            drawSeries(series, canvas, paint, points, seriesRenderer, yAxisValue, i, or, startIndex, intRange);
            ClickableArea[] clickableAreasForSubSeries = clickableAreasForPoints(MathHelper.getFloats(points), MathHelper.getDoubles(values), yAxisValue, i, startIndex, intRange);
            clickableArea.addAll(Arrays.asList(clickableAreasForSubSeries));
        }
    }
    // draw stuff over the margins such as data doesn't render on these areas
    drawBackground(mRenderer, canvas, x, bottom, width, height - bottom, paint, true, mRenderer.getMarginsColor());
    drawBackground(mRenderer, canvas, x, y, width, margins[0], paint, true, mRenderer.getMarginsColor());
    if (or == Orientation.HORIZONTAL) {
        drawBackground(mRenderer, canvas, x, y, left - x, height - y, paint, true, mRenderer.getMarginsColor());
        drawBackground(mRenderer, canvas, right, y, margins[3], height - y, paint, true, mRenderer.getMarginsColor());
    } else if (or == Orientation.VERTICAL) {
        drawBackground(mRenderer, canvas, right, y, width - right, height - y, paint, true, mRenderer.getMarginsColor());
        drawBackground(mRenderer, canvas, x, y, left - x, height - y, paint, true, mRenderer.getMarginsColor());
    }
    boolean showLabels = mRenderer.isShowLabels() && hasValues;
    boolean showGridX = mRenderer.isShowGridX();
    boolean showCustomTextGrid = mRenderer.isShowCustomTextGrid();
    if (showLabels || showGridX) {
        List<Double> xLabels = getValidLabels(getXLabels(minX[0], maxX[0], mRenderer.getXLabels()));
        Map<Integer, List<Double>> allYLabels = getYLabels(minY, maxY, maxScaleNumber);
        int xLabelsLeft = left;
        if (showLabels) {
            paint.setColor(mRenderer.getXLabelsColor());
            paint.setTextSize(mRenderer.getLabelsTextSize());
            paint.setTextAlign(mRenderer.getXLabelsAlign());
            if (mRenderer.getXLabelsAlign() == Align.LEFT) {
                xLabelsLeft += mRenderer.getLabelsTextSize() / 4;
            }
        }
        drawXLabels(xLabels, mRenderer.getXTextLabelLocations(), canvas, paint, xLabelsLeft, top, bottom, xPixelsPerUnit[0], minX[0], maxX[0]);
        drawYLabels(allYLabels, canvas, paint, maxScaleNumber, left, right, bottom, yPixelsPerUnit, minY);
        if (showLabels) {
            paint.setColor(mRenderer.getLabelsColor());
            for (int i = 0; i < maxScaleNumber; i++) {
                Align axisAlign = mRenderer.getYAxisAlign(i);
                Double[] yTextLabelLocations = mRenderer.getYTextLabelLocations(i);
                for (Double location : yTextLabelLocations) {
                    if (minY[i] <= location && location <= maxY[i]) {
                        float yLabel = (float) (bottom - yPixelsPerUnit[i] * (location.doubleValue() - minY[i]));
                        String label = mRenderer.getYTextLabel(location, i);
                        paint.setColor(mRenderer.getYLabelsColor(i));
                        paint.setTextAlign(mRenderer.getYLabelsAlign(i));
                        if (or == Orientation.HORIZONTAL) {
                            if (axisAlign == Align.LEFT) {
                                canvas.drawLine(left + getLabelLinePos(axisAlign), yLabel, left, yLabel, paint);
                                drawText(canvas, label, left, yLabel - 2, paint, mRenderer.getYLabelsAngle());
                            } else {
                                canvas.drawLine(right, yLabel, right + getLabelLinePos(axisAlign), yLabel, paint);
                                drawText(canvas, label, right, yLabel - 2, paint, mRenderer.getYLabelsAngle());
                            }
                            if (showCustomTextGrid) {
                                paint.setColor(mRenderer.getGridColor());
                                canvas.drawLine(left, yLabel, right, yLabel, paint);
                            }
                        } else {
                            canvas.drawLine(right - getLabelLinePos(axisAlign), yLabel, right, yLabel, paint);
                            drawText(canvas, label, right + 10, yLabel - 2, paint, mRenderer.getYLabelsAngle());
                            if (showCustomTextGrid) {
                                paint.setColor(mRenderer.getGridColor());
                                canvas.drawLine(right, yLabel, left, yLabel, paint);
                            }
                        }
                    }
                }
            }
        }
        if (showLabels) {
            paint.setColor(mRenderer.getLabelsColor());
            float size = mRenderer.getAxisTitleTextSize();
            paint.setTextSize(size);
            paint.setTextAlign(Align.CENTER);
            if (or == Orientation.HORIZONTAL) {
                drawText(canvas, mRenderer.getXTitle(), x + width / 2, bottom + mRenderer.getLabelsTextSize() * 4 / 3 + size, paint, 0);
                for (int i = 0; i < maxScaleNumber; i++) {
                    Align axisAlign = mRenderer.getYAxisAlign(i);
                    if (axisAlign == Align.LEFT) {
                        drawText(canvas, mRenderer.getYTitle(i), x + size, y + height / 2, paint, -90);
                    } else {
                        drawText(canvas, mRenderer.getYTitle(i), x + width, y + height / 2, paint, -90);
                    }
                }
                paint.setTextSize(mRenderer.getChartTitleTextSize());
                drawText(canvas, mRenderer.getChartTitle(), x + width / 2, y + mRenderer.getChartTitleTextSize(), paint, 0);
            } else if (or == Orientation.VERTICAL) {
                drawText(canvas, mRenderer.getXTitle(), x + width / 2, y + height - size, paint, -90);
                drawText(canvas, mRenderer.getYTitle(), right + 20, y + height / 2, paint, 0);
                paint.setTextSize(mRenderer.getChartTitleTextSize());
                drawText(canvas, mRenderer.getChartTitle(), x + size, top + height / 2, paint, 0);
            }
        }
    }
    if (or == Orientation.HORIZONTAL) {
        drawLegend(canvas, mRenderer, titles, left, right, y, width, height, legendSize, paint, false);
    } else if (or == Orientation.VERTICAL) {
        transform(canvas, angle, true);
        drawLegend(canvas, mRenderer, titles, left, right, y, width, height, legendSize, paint, false);
        transform(canvas, angle, false);
    }
    if (mRenderer.isShowAxes()) {
        paint.setColor(mRenderer.getAxesColor());
        canvas.drawLine(left, bottom, right, bottom, paint);
        boolean rightAxis = false;
        for (int i = 0; i < maxScaleNumber && !rightAxis; i++) {
            rightAxis = mRenderer.getYAxisAlign(i) == Align.RIGHT;
        }
        if (or == Orientation.HORIZONTAL) {
            canvas.drawLine(left, top, left, bottom, paint);
            if (rightAxis) {
                canvas.drawLine(right, top, right, bottom, paint);
            }
        } else if (or == Orientation.VERTICAL) {
            canvas.drawLine(right, top, right, bottom, paint);
        }
    }
    if (rotate) {
        transform(canvas, angle, true);
    }
}
Also used : XYSeries(org.achartengine.model.XYSeries) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) Rect(android.graphics.Rect) Align(android.graphics.Paint.Align) Point(org.achartengine.model.Point) Orientation(org.achartengine.renderer.XYMultipleSeriesRenderer.Orientation) Point(org.achartengine.model.Point) Paint(android.graphics.Paint) LinkedList(java.util.LinkedList) SimpleSeriesRenderer(org.achartengine.renderer.SimpleSeriesRenderer)

Aggregations

XYSeries (org.achartengine.model.XYSeries)15 XYMultipleSeriesDataset (org.achartengine.model.XYMultipleSeriesDataset)5 XYSeriesRenderer (org.achartengine.renderer.XYSeriesRenderer)4 Paint (android.graphics.Paint)3 ArrayList (java.util.ArrayList)3 Resources (android.content.res.Resources)2 Align (android.graphics.Paint.Align)2 Rect (android.graphics.Rect)2 LayoutParams (android.view.ViewGroup.LayoutParams)2 IndexedProcessVar (com.fr3ts0n.pvs.IndexedProcessVar)2 Date (java.util.Date)2 LinkedList (java.util.LinkedList)2 List (java.util.List)2 GraphicalView (org.achartengine.GraphicalView)2 RoundChart (org.achartengine.chart.RoundChart)2 XYChart (org.achartengine.chart.XYChart)2 Point (org.achartengine.model.Point)2 DefaultRenderer (org.achartengine.renderer.DefaultRenderer)2 Orientation (org.achartengine.renderer.XYMultipleSeriesRenderer.Orientation)2 ChartDciConfig (org.netxms.ui.android.main.activities.helpers.ChartDciConfig)2