MPandroidChart - увеличивать и уменьшать масштаб, чтобы соответствовать значениям только по оси Y
Я работаю с потрясающей библиотекой с открытым исходным кодом MPandroidChart и заполняю диаграмму в реальном времени из данных, которые я получаю в сети. При заполнении диаграммы новыми значениями я разрешаю отображать только определенное количество индекса x, используя "setVisibleXRange()"и"moveViewToX()", чтобы переместить диаграмму в левую часть экрана, отображая только последние записи за раз.
все это прекрасно работает, но я хочу создать ситуацию, когда порт вида изменяется так, чтобы он точно соответствовал максимальным и минимальным видимым значениям, так же, как "fitScreen()", но при этом изменяется только ось Y. "zoomOut()" и "zoomIn()" используют относительные входы, так же как и "zoom()", поэтому я не могу использовать их на основе моих данных. мне нужен способ позиционирования вида по оси Y, чтобы он соответствовал различным диапазонам в каждом цикле, например: от 2 до 15 или от -98 до 34 и так далее.
у кого-нибудь есть идеи о том, как это можно сделать? цените все ответы. @PhillJay
2 ответа
Это немного стар, но для кого это может касаться, ответ не об оси. Что вам нужно, это изменить видовой экран:
private void autoScaleLineChart(@NonNull LineChart lineChart) {
if (lineChart.getLineData() == null) return;
float lowestVisibleX = lineChart.getLowestVisibleX();
float highestVisibleX = lineChart.getHighestVisibleX();
LineData chartData = lineChart.getLineData();
chartData.calcMinMaxY(lowestVisibleX, highestVisibleX);
//calculating offsets for axes to display correct labels
lineChart.getXAxis().calculate(chartData.getXMin(), chartData.getXMax());
calculateMinMaxForYAxis(lineChart, YAxis.AxisDependency.LEFT);
calculateMinMaxForYAxis(lineChart, YAxis.AxisDependency.RIGHT);
//this is where the magic happens
lineChart.calculateOffsets();
//if nothing happens try adding
//lineChart.invalidate();
}
private void calculateMinMaxForYAxis(@NonNull LineChart lineChart, @NonNull YAxis.AxisDependency axisDependency) {
LineData chartData = lineChart.getLineData();
YAxis yAxis = lineChart.getAxis(axisDependency);
if (yAxis.isEnabled()) {
float yMin = chartData.getYMin(axisDependency);
float yMax = chartData.getYMax(axisDependency);
yAxis.calculate(yMin, yMax);
}
}
Также может быть полезно прочитать это: https://github.com/PhilJay/MPAndroidChart/wiki/Modifying-the-Viewport
Возможно, этот ответ не идеален, но Yaxis может уместиться на экране:
chart.getAxisLeft().setLabelCount(10, true);
chart.fitScreen();
Я предлагаю вам прочитать документацию YAxis.
Сосредоточьтесь на следующих методах:
setStartAtZero(...)
setAxisMaxValue(...)
&setAxisMinValue(...)
setSpaceTop(...)
setSpaceBottom(...)
С некоторыми из них вы должны быть в состоянии ограничить видимую область оси точно в соответствии с вашими потребностями.