Я работаю над визуализатором регрессионной модели, и мое текущее узкое место связано с построением непрерывных функций.Работа программы заключается в том, что она загружает данные из файла, содержащего значения (x, y), выполняет математику для модели регрессии с матрицами, а затем дает моделям регрессии баллы ScatterChart
для построения графика.Одна точка построения для регрессионной модели определяется коэффициентами модели и step
, который действует как dx между двумя исходными точками данных.
По существу, если dx установлен равным 0,1 и x1= 0, x2 = 10, у нас будет 98 модельных точек между x1 и x2.Если вас интересует вот математика для модели: https://newonlinecourses.science.psu.edu/stat501/node/382/
PolynomialGraph
, показанный в коде, по сути является регрессионной моделью.Он знает, как задавать исходные точки данных до максимального значения и как рассчитывать точки графика для этого максимального значения.Все значения являются (Double, Double)
кортежами.
Моя проблема связана с тем фактом, что в зависимости от того, сколько точек графика я вычисляю, нарисованный график может не быть непрерывным полностью.Это связано с тем, что одна точка графика имеет постоянный размер (определенный в CSS), поэтому, если ScatterChart
имеет большой width
и dx между двумя точками графика (x1, y1) и (x2, y2)слишком велик относительно конечной точки оси x, на графике будут видимые пространства.Размер и форма точек оригинала и модели указаны в коде CSS ниже.
Примером может быть то, что (x1, y1) = (0, 10) и (x2, y2) = (100, 110)и dx = 100. Теперь между (x1, y1) и (x2, y2) нарисованы нулевые точки.
Есть ли разумный способ решить эту проблему?Я старался изо всех сил с ScalaFX и JavaFX API.Но я хочу верить, что есть лучшее решение, чем каким-то образом вычислять, сколько точек графика будет приблизительно в одном пикселе, и таким образом определять, сколько точек нужно нарисовать.
Другой способ - найтиинтервалы, где dy является наибольшим и каким-то образом определяют, сколько очков нужно.
Кроме этого, я действительно не имею понятия, как решить эту проблему динамически.Я всегда могу установить dx около 10E-9
, но это не очень хорошо масштабируется.Если диапазон значений по оси x огромный, мы можем легко установить dx даже равным 100. В то время как максимальное значение равно единице, нам может потребоваться, чтобы dx было около 10E-9
.
package regression
import scalafx.scene.chart.ScatterChart
import scalafx.collections.ObservableBuffer
import scalafx.scene.chart.XYChart
import scalafx.scene.chart.NumberAxis
object Plotter {
def drawGraph(xName: String, yName: String, graph: PolynomialGraph): ScatterChart[Number, Number] = {
val xAxis = NumberAxis()
val yAxis = NumberAxis()
val pData = XYChart.Series[Number, Number](
xName,
ObservableBuffer(graph.dataPointsUntilMaxX().map(z => XYChart.Data[Number, Number](z._2, z._1)): _*)) //Values have to be in order x, y
val model = XYChart.Series[Number, Number](
yName,
ObservableBuffer(graph.calculatePlotPoints().map(z => XYChart.Data[Number, Number](z._1, z._2)): _*))
val temp = new ScatterChart(xAxis, yAxis, ObservableBuffer(model, pData))
temp
}
}
.default-color0.chart-symbol {
-fx-background-color: blue;
-fx-background-radius: 0.5px;
-fx-opacity: 1.0;
-fx-padding: 1px;
}
.default-color1.chart-symbol {
-fx-background-color: red, white;
-fx-background-insets: 0, 2;
-fx-background-radius: 2px;
-fx-padding: 3px;
}
Максимальное значение x исходных данных составляет 23,5
Первое показанное изображение имеет dx 0,001, что означает, что для графика модели рассчитано 23500 точек.
Второе показанное изображение имеет dx 0,1.Теперь для графика рассчитывается только 235 точек, и между любыми двумя точками на кривой есть видимое пространство.