通过不同的Y截距和X值绘制多条回归线

我试图通过线性回归线通过共享相同斜率的单独的数据集群。 然而,虽然我已经成功地为点本身绘制了不同的颜色并成功地绘制了这些颜色,但我在线上的尝试不起作用。

之前我尝试过一个hashset,它通过颜色调出簇,但这会导致行进入的顺序出现问题。

在此尝试中,我尝试通过数字附件链接群集,然后基于此调用行。

代码的第一部分并不真正相关,因为我没有更改任何内容,而且该部分按预期工作。 它从其他类调用,但由于问题不存在,我不认为显示其他类将与我当前的问题相关。

我的代码的第二块是我迷失的地方。 为什么它看起来好像没有编译? 没有给出错误,它基本上只被视为幻像代码,好像我的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 paints = new HashSet(); 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语句有关? 我尝试在index ++之前移动它并在它之后移动它们并返回相同的结果。

  for (int i = 0; i < this.getData()[0].length; i++) { TreeSet xCoords = new TreeSet(); //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"); } } } 

这是图表图表结果

如果没有一个完整的例子 ,很难说你当前的方法失败了。 下面的完整示例说明了方法Regression.getOLSRegression() ,它使用普通最小二乘来查找估计XYDataset一系列的线的系数。 表示估计值的第二个系列(以蓝色显示)将添加到XYDataset

您可以通过向数据集添加多个系列或在绘图中使用多个渲染器来组合更精细的图表。

图片

 import java.awt.Dimension; import java.awt.EventQueue; import java.util.Random; import javax.swing.JFrame; import org.jfree.chart.*; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.statistics.Regression; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; /** @see https://stackoverflow.com/a/37716411/230513 */ public class RegressionTest { private static final int N = 16; private static final Random R = new Random(); private static XYDataset createDataset() { XYSeries series = new XYSeries("Data"); for (int i = 0; i < N; i++) { series.add(i, R.nextGaussian() + i); } XYSeriesCollection xyData = new XYSeriesCollection(series); double[] coefficients = Regression.getOLSRegression(xyData, 0); double b = coefficients[0]; // intercept double m = coefficients[1]; // slope XYSeries trend = new XYSeries("Trend"); double x = series.getDataItem(0).getXValue(); trend.add(x, m * x + b); x = series.getDataItem(series.getItemCount() - 1).getXValue(); trend.add(x, m * x + b); xyData.addSeries(trend); return xyData; } private static JFreeChart createChart(final XYDataset dataset) { JFreeChart chart = ChartFactory.createXYLineChart("Test", "X", "Y", dataset, PlotOrientation.VERTICAL, true, false, false); return chart; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); XYDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart) { @Override public Dimension getPreferredSize() { return new Dimension(640, 480); } }; f.add(chartPanel); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } }); } }