2016-06-08 3 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 문과 관련이 있다면 궁금합니다. 나는 인덱스 ++ 이전에 그것을 움직이려고 시도했다. 그리고 그것과 둘 다 같은 결과를 반환했다.

   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, 그것은 현재의 접근 방식이 실패 할 경우 말을하기 어렵다. 아래의 전체 예제는 을 사용하여 XYDataset에있는 계열을 추정하는 선의 계수를 찾는 방법 Regression.getOLSRegression()을 보여줍니다. 아래에 파란색으로 표시된 예상치를 나타내는 두 번째 계열이 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

는, 현재의 접근 방식을 보여줍니다 A [mcve] 포함하도록 질문을 수정하시기 바랍니다. – trashgod

관련 문제