Построение нескольких линий регрессии через различные Y-перехватчики и X-значения
Я пытаюсь через линию линейной регрессии через отдельные отдельные кластеры данных, которые имеют один и тот же наклон. Однако, хотя я успешно нарисовал различные цвета для самих точек и успешно их прорисовал, моя попытка линии не работает.
Ранее я пробовал хэш-набор, который выполнялся при вызове кластеров по цветам, но это вызывало проблемы с порядком, в котором появились строки.
В этой попытке я попытался связать кластеры через присоединение номера, а затем вызывать линии, основываясь на этом.
Первая часть кода на самом деле не актуальна, поскольку я там ничего не менял, и эта часть работает так, как задумано. Он вызывается из других классов, но поскольку проблема не существует, я не думаю, что показ других классов будет иметь отношение к моей текущей проблеме.
Второй блок моего кода, где я потерялся. Почему кажется, что он не компилируется? Никакой ошибки не дается, и это, по сути, просто считается фантомным кодом, как будто мой оператор if не выполняется даже для его инициализации?
Ниже приведен первый блок, который может быть не актуален. Второй блок кода - моя большая проблема. Извините, я новичок в этих форумах, я не совсем уверен в процедурах постановки вопроса.
package clusters;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.util.HashSet;
import java.util.TreeSet;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CrosshairState;
import org.jfree.chart.plot.FastScatterPlot;
import org.jfree.chart.plot.PlotRenderingInfo;
import org.jfree.ui.RectangleEdge;
public class ExtendedFastScatterPlot extends FastScatterPlot {
/**
*
*/
private static final long serialVersionUID = 1L;
int[] sizes;
Paint[] colors;
int[] shapes;
public ExtendedFastScatterPlot(float[][] data, NumberAxis domainAxis, NumberAxis rangeAxis, int[] sizes,
Paint[] colors, int[] shapes) {
super(data, domainAxis, rangeAxis);
this.sizes = sizes;
this.colors = colors;
this.shapes = shapes;
}
@Override
public void render(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, CrosshairState crosshairState) {
// g2.setPaint(Color.BLUE);
if (this.getData() != null) {
for (int i = 0; i < this.getData()[0].length; i++) {
float x = this.getData()[0][i];
float y = this.getData()[1][i];
int size = this.sizes[i];
int transX = (int) this.getDomainAxis().valueToJava2D(x, dataArea, RectangleEdge.BOTTOM);
int transY = (int) this.getRangeAxis().valueToJava2D(y, dataArea, RectangleEdge.LEFT);
g2.setPaint(this.colors[i]);
if (1 == this.shapes[i]) {
g2.fillRect(transX, transY, size, size);
} else {
g2.fillOval(transX, transY, size, size);
}
}
}
g2.setColor(java.awt.Color.red);
try {
double[] lineData = GaussianElimination.calcLines();
/*HashSet<Paint> paints = new HashSet<Paint>();
for (Paint p : colors) {
paints.add(p);
}*/
for (int index = 1; index < lineData.length; index++) {
double slope = lineData[0];
//for (Paint p : paints) {
В приведенной ниже части кода я попытался создать линию для каждого кластера по номеру, в котором в Treeset следует смоделировать новые линии наклона, через которые он будет проходить. Однако, по какой-то причине, это как если бы код не существовал. Ничего не работает, и мне любопытно, имеет ли это какое-то отношение к оператору break, который я, возможно, потерял? Я пытался переместить его до индекса ++ и после него, и оба возвращали одинаковые результаты.
for (int i = 0; i < this.getData()[0].length; i++) {
TreeSet<Double> xCoords = new TreeSet<Double>();
//if (colors[i].equals(p)) {
xCoords.add((double) this.getData()[0][i]);
//}
//}
double xleft = xCoords.first();
double xright = xCoords.last();
double yleft = slope * xleft + lineData[index];
double yright = slope * xright + lineData[index];
int txstart = (int) this.getDomainAxis().valueToJava2D(xleft, dataArea, RectangleEdge.BOTTOM);
int tystart = (int) this.getRangeAxis().valueToJava2D(yleft, dataArea, RectangleEdge.LEFT);
int txend = (int) this.getDomainAxis().valueToJava2D(xright, dataArea, RectangleEdge.BOTTOM);
int tyend = (int) this.getRangeAxis().valueToJava2D(yright, dataArea, RectangleEdge.LEFT);
g2.setPaint(Color.getHSBColor(i/(lineData.length - 1), 1, 1 ));
g2.drawLine(txstart, tystart, txend, tyend);
//index++;
//if (index >= lineData.length) break;
}
}**
} catch (IOException e) {
System.out.println("Unable to open data files");
}
}
}
Вот графикГрафик Результат