1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-16 21:54:05 +02:00

added linear regression line for trend analysis, see issue #436

This commit is contained in:
oliexdev
2019-05-26 12:39:04 +02:00
parent 1150f695f7
commit a0b9cab56f
4 changed files with 36 additions and 26 deletions

View File

@@ -139,6 +139,7 @@ public class ChartMeasurementView extends LineChart {
isAnimationOn = true;
isInGraphKey = true;
setHardwareAccelerationEnabled(true);
setMarker(new ChartMarkerView(getContext(), R.layout.chart_markerview));
setDoubleTapToZoomEnabled(false);
setHighlightPerTapEnabled(true);
@@ -512,10 +513,6 @@ public class ChartMeasurementView extends LineChart {
entry.setData(extraData);
lineEntries.add(entry);
/*if (prefs.getBoolean("regressionLine", false) && measurementView instanceof WeightMeasurementView) {
polyFitter.addPoint((double)entry.getX(), (double)entry.getY());
}*/
}
addMeasurementLine(lineDataSets, lineEntries, measurementView);
@@ -523,7 +520,10 @@ public class ChartMeasurementView extends LineChart {
}
addGoalLine(lineDataSets);
// addRegressionLine(lineDataSets); TODO replaced it with an sliding average
if (isInGraphKey) {
addRegressionLine(lineDataSets);
}
LineData data = new LineData(lineDataSets);
setData(data);
@@ -607,7 +607,6 @@ public class ChartMeasurementView extends LineChart {
}
}
// TODO replace with sliding average
private void addRegressionLine(List<ILineDataSet> lineDataSets) {
if (prefs.getBoolean("regressionLine", false)) {
int regressLineOrder = 1;
@@ -619,27 +618,40 @@ public class ChartMeasurementView extends LineChart {
prefs.edit().putString("regressionLineOrder", "1").apply();
}
PolynomialFitter polyFitter = new PolynomialFitter(Math.min(regressLineOrder, 100));
List<ILineDataSet> regressionLineDataSets = new ArrayList<>();
PolynomialFitter.Polynomial polynomial = polyFitter.getBestFit();
for (ILineDataSet dataSet : lineDataSets) {
PolynomialFitter polyFitter = new PolynomialFitter(Math.min(regressLineOrder, 100));
List<Entry> valuesLinearRegression = new Stack<>();
for (int i=0; i<dataSet.getEntryCount(); i++) {
Entry entry = dataSet.getEntryForIndex(i);
polyFitter.addPoint((double) entry.getX(), (double) entry.getY());
}
for (int i = minXValue; i < maxXValue; i++) {
double y_value = polynomial.getY(i);
valuesLinearRegression.add(new Entry((float) i, (float) y_value));
PolynomialFitter.Polynomial polynomial = polyFitter.getBestFit();
List<Entry> valuesLinearRegression = new Stack<>();
for (int i = minXValue; i < maxXValue; i++) {
double y_value = polynomial.getY(i);
valuesLinearRegression.add(new Entry((float) i, (float) y_value));
}
LineDataSet linearRegressionLine = new LineDataSet(valuesLinearRegression, dataSet.getLabel() + "-" + getContext().getString(R.string.label_regression_line));
linearRegressionLine.setLineWidth(1.5f);
linearRegressionLine.setColor(dataSet.getColor());
linearRegressionLine.setAxisDependency(dataSet.getAxisDependency());
linearRegressionLine.setDrawValues(false);
linearRegressionLine.setDrawCircles(false);
linearRegressionLine.setHighlightEnabled(false);
linearRegressionLine.enableDashedLine(10, 30, 0);
regressionLineDataSets.add(linearRegressionLine);
}
LineDataSet linearRegressionLine = new LineDataSet(valuesLinearRegression, getContext().getString(R.string.label_regression_line));
linearRegressionLine.setLineWidth(1.5f);
linearRegressionLine.setColor(ColorUtil.COLOR_VIOLET);
linearRegressionLine.setAxisDependency(prefs.getBoolean("weightOnRightAxis", true) ? YAxis.AxisDependency.RIGHT : YAxis.AxisDependency.LEFT);
linearRegressionLine.setDrawValues(false);
linearRegressionLine.setDrawCircles(false);
linearRegressionLine.setHighlightEnabled(false);
linearRegressionLine.enableDashedLine(10, 30, 0);
lineDataSets.add(linearRegressionLine);
for (ILineDataSet dataSet : regressionLineDataSets) {
lineDataSets.add(dataSet);
}
}
}
}

View File

@@ -110,7 +110,7 @@
<string name="error_initial_weight_required">Fehler: Anfangsgewicht ist erforderlich</string>
<string name="label_bt_device_no_support">Gerät wird nicht unterstützt</string>
<string name="label_goal_line">Ziellinie</string>
<string name="label_regression_line">Gewichtsregressionsgerade</string>
<string name="label_regression_line">Regressionsgerade</string>
<string name="label_regression_line_degree">Polynomischer Regressions-Grad</string>
<string name="label_bluetooth_searching">Suche nach Ihrer Bluetooth Waagen</string>
<string name="label_bone">Knochenmasse</string>

View File

@@ -136,7 +136,7 @@
<string name="label_not_found">not found</string>
<string name="label_ignoreOutOfRange">Ignore out of range data</string>
<string name="label_initial_weight">Initial weight</string>
<string name="label_regression_line">Regression weight line</string>
<string name="label_regression_line">Regression line</string>
<string name="label_regression_line_degree">Regression polynomial degree</string>
<string name="label_goal_line">Goal line</string>
<string name="label_help">Help</string>

View File

@@ -24,7 +24,6 @@
android:summaryOff="@string/info_is_not_visible"
android:summaryOn="@string/info_is_visible"
android:title="@string/label_goal_line" />
<!--
<CheckBoxPreference
android:defaultValue="false"
android:key="regressionLine"
@@ -36,5 +35,4 @@
android:dependency="regressionLine"
android:key="regressionLineOrder"
android:title="@string/label_regression_line_degree" />
-->
</PreferenceScreen>