mirror of
https://github.com/oliexdev/openScale.git
synced 2025-08-17 14:10:54 +02:00
added linear regression line for trend analysis, see issue #436
This commit is contained in:
@@ -139,6 +139,7 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
isAnimationOn = true;
|
isAnimationOn = true;
|
||||||
isInGraphKey = true;
|
isInGraphKey = true;
|
||||||
|
|
||||||
|
setHardwareAccelerationEnabled(true);
|
||||||
setMarker(new ChartMarkerView(getContext(), R.layout.chart_markerview));
|
setMarker(new ChartMarkerView(getContext(), R.layout.chart_markerview));
|
||||||
setDoubleTapToZoomEnabled(false);
|
setDoubleTapToZoomEnabled(false);
|
||||||
setHighlightPerTapEnabled(true);
|
setHighlightPerTapEnabled(true);
|
||||||
@@ -512,10 +513,6 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
entry.setData(extraData);
|
entry.setData(extraData);
|
||||||
|
|
||||||
lineEntries.add(entry);
|
lineEntries.add(entry);
|
||||||
|
|
||||||
/*if (prefs.getBoolean("regressionLine", false) && measurementView instanceof WeightMeasurementView) {
|
|
||||||
polyFitter.addPoint((double)entry.getX(), (double)entry.getY());
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addMeasurementLine(lineDataSets, lineEntries, measurementView);
|
addMeasurementLine(lineDataSets, lineEntries, measurementView);
|
||||||
@@ -523,7 +520,10 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addGoalLine(lineDataSets);
|
addGoalLine(lineDataSets);
|
||||||
// addRegressionLine(lineDataSets); TODO replaced it with an sliding average
|
|
||||||
|
if (isInGraphKey) {
|
||||||
|
addRegressionLine(lineDataSets);
|
||||||
|
}
|
||||||
|
|
||||||
LineData data = new LineData(lineDataSets);
|
LineData data = new LineData(lineDataSets);
|
||||||
setData(data);
|
setData(data);
|
||||||
@@ -607,7 +607,6 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO replace with sliding average
|
|
||||||
private void addRegressionLine(List<ILineDataSet> lineDataSets) {
|
private void addRegressionLine(List<ILineDataSet> lineDataSets) {
|
||||||
if (prefs.getBoolean("regressionLine", false)) {
|
if (prefs.getBoolean("regressionLine", false)) {
|
||||||
int regressLineOrder = 1;
|
int regressLineOrder = 1;
|
||||||
@@ -619,27 +618,40 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
prefs.edit().putString("regressionLineOrder", "1").apply();
|
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++) {
|
PolynomialFitter.Polynomial polynomial = polyFitter.getBestFit();
|
||||||
double y_value = polynomial.getY(i);
|
|
||||||
valuesLinearRegression.add(new Entry((float) i, (float) y_value));
|
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));
|
for (ILineDataSet dataSet : regressionLineDataSets) {
|
||||||
linearRegressionLine.setLineWidth(1.5f);
|
lineDataSets.add(dataSet);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -110,7 +110,7 @@
|
|||||||
<string name="error_initial_weight_required">Fehler: Anfangsgewicht ist erforderlich</string>
|
<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_bt_device_no_support">Gerät wird nicht unterstützt</string>
|
||||||
<string name="label_goal_line">Ziellinie</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_regression_line_degree">Polynomischer Regressions-Grad</string>
|
||||||
<string name="label_bluetooth_searching">Suche nach Ihrer Bluetooth Waagen</string>
|
<string name="label_bluetooth_searching">Suche nach Ihrer Bluetooth Waagen</string>
|
||||||
<string name="label_bone">Knochenmasse</string>
|
<string name="label_bone">Knochenmasse</string>
|
||||||
|
@@ -136,7 +136,7 @@
|
|||||||
<string name="label_not_found">not found</string>
|
<string name="label_not_found">not found</string>
|
||||||
<string name="label_ignoreOutOfRange">Ignore out of range data</string>
|
<string name="label_ignoreOutOfRange">Ignore out of range data</string>
|
||||||
<string name="label_initial_weight">Initial weight</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_regression_line_degree">Regression polynomial degree</string>
|
||||||
<string name="label_goal_line">Goal line</string>
|
<string name="label_goal_line">Goal line</string>
|
||||||
<string name="label_help">Help</string>
|
<string name="label_help">Help</string>
|
||||||
|
@@ -24,7 +24,6 @@
|
|||||||
android:summaryOff="@string/info_is_not_visible"
|
android:summaryOff="@string/info_is_not_visible"
|
||||||
android:summaryOn="@string/info_is_visible"
|
android:summaryOn="@string/info_is_visible"
|
||||||
android:title="@string/label_goal_line" />
|
android:title="@string/label_goal_line" />
|
||||||
<!--
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="regressionLine"
|
android:key="regressionLine"
|
||||||
@@ -36,5 +35,4 @@
|
|||||||
android:dependency="regressionLine"
|
android:dependency="regressionLine"
|
||||||
android:key="regressionLineOrder"
|
android:key="regressionLineOrder"
|
||||||
android:title="@string/label_regression_line_degree" />
|
android:title="@string/label_regression_line_degree" />
|
||||||
-->
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
Reference in New Issue
Block a user