MPAndroidChart определяет точный / фиксированный интервал между значениями по оси X (время) - PullRequest
0 голосов
/ 05 июня 2018

Я использую в приложении библиотеку MPAndroidChart и теперь у меня есть линейный график:

enter image description here

На оси X у меня есть секунды, и яхочу иметь одинаковый интервал между значениями по оси X.Теперь у меня есть 19:03 и 19:20, но я хочу 19:05, 19:10, 19:15 (поэтому с интервалом в 300 секунд) ...

Как я могу это сделать?

Теперь я использую эту функциональность:

 lineChart.setScaleMinima(115f, 1f);

, но это не очень хорошо.Также я хочу изменить интервал от 5 минут до 1 часа или 1 дня.

Возможно ли это?

1 Ответ

0 голосов
/ 26 июня 2018

tl; dr Установите минимальные и максимальные значения оси X на кратные интервалы, которые вы хотите (например, кратные 5), и установите гранулярность оси на соответствующее кратное значение этого же интервала (например, 5).

Полный пример Вот пример программы тестирования, показывающей, как установить границы оси и гранулярность, чтобы маркеры были кратны некоторому вашему выбору.Опция гранулярности устанавливает минимальное разрешение для оси, а установка xMin и xMax на кратное значение означает, что расстояние между осями будет кратным вашему выбору.Обратите внимание, что, например, если вы выберете 5-минутный интервал, вы можете получить тики осей с интервалом в 10 минут (или 15 или 20), чтобы сохранить соответствующее количество линий осей.

РЕДАКТИРОВАТЬ: OP спросил о реальномграфик времени, поэтому я обновил пример для построения волны синуса в реальном времени.

package com.project.testchart;

import android.graphics.Color;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private final Handler handler = new Handler();
    private ArrayList<Entry> data = new ArrayList<>();

    @Override
    protected void onPause() {
        super.onPause();
        handler.removeCallbacksAndMessages(null);
    }

    @Override
    protected void onResume() {
        super.onResume();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                addPointToChart();
                drawChart();
                handler.postDelayed(this, 250);
            }
        }, 250);
    }

    private void addPointToChart() {

        while( data.size() > 100 ) {
            data.remove(0);
        }

        lastX += 1f;
        float y = (float)Math.sin(lastX/5f);
        data.add(new Entry(lastX,y));
    }

    private void drawChart() {

        float textSize = 20f;

        LineDataSet line = new LineDataSet(data, "Sin");
        line.setLineWidth(5);
        line.setColor(Color.BLACK);
        line.setDrawValues(false);
        line.setDrawCircles(false);
        line.setHighLightColor(Color.TRANSPARENT);

        LineData lines = new LineData();
        lines.addDataSet(line);

        LineChart chart = findViewById(R.id.test_chart);
        chart.setData(lines);

        Description desc = new Description();
        desc.setText("");
        chart.setDescription(desc);
        chart.setDrawBorders(true);

        YAxis yAxisR = chart.getAxisRight();
        yAxisR.setDrawGridLines(false);
        yAxisR.setEnabled(false);

        YAxis yAxisL = chart.getAxisLeft();
        yAxisL.setDrawGridLines(true);
        yAxisL.setDrawTopYLabelEntry(true);
        yAxisL.setTextSize(textSize);

        XAxis xAxis = chart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setTextSize(textSize);

        float xMin = (float)Math.floor((line.getXMin()-xInterval)/xInterval)*xInterval;
        float xMax = (float)Math.ceil((line.getXMax()+xInterval)/xInterval)*xInterval;
        float xSpan = xMax - xMin;
        float xi = xSpan / 6; // approximately 6 labels
        float xGran = Math.max(xInterval,(float)Math.round(xi/xInterval)*xInterval);

        xAxis.setGranularity(xGran);
        xAxis.setAxisMinimum(xMin);
        xAxis.setAxisMaximum(xMax);

        Legend l = chart.getLegend();
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setTextSize(textSize);

        chart.setExtraBottomOffset(10f);
        chart.setExtraRightOffset(20f);

        chart.invalidate();
    }

    private float xInterval = 5f;
    private float lastX = 0f;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        float xStart = 3f;
        float xEnd = 7f;
        for(int i = 0; i < 4; ++i) {
            float x = xStart + (i/3f)*(xEnd-xStart);
            float y = (float)Math.sin(x/5f);
            data.add(new Entry(x,y));
        }
        lastX = xEnd;

        drawChart();
    }
}

И файл XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.github.mikephil.charting.charts.LineChart
        android:id="@+id/test_chart"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="32dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

</android.support.constraint.ConstraintLayout>

Некоторые снимки экрана для различных диапазонов данных

Example screenshots

...