2016-06-08 89 views
1

我试图通过线性回归线通过共享相同斜率的各个单独的数据集群。然而,尽管我已经成功地为点绘制了不同的颜色,并且成功绘制了这些颜色,但是我在线上的尝试不起作用。通过不同的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<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语句有关?我试着在index ++之前移动它,并在它之后返回相同的结果。

   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"); 
     } 
    } 
} 

这里是图 Graph Result

回答

1

没有一个明确的complete example,很难说得清你目前的做法失败。下面的完整示例说明了方法Regression.getOLSRegression(),该方法使用ordinary least squares来查找估计XYDataset中的系列的一行的系数。代表估算的第二个系列(如下面蓝色所示)被添加到XYDataset

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

image

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); 
      } 
     }); 
    } 
} 
+0

如果这个方法未能解决您的问题,请编辑您的问题包括[MCVE]显示你目前的做法。 – trashgod