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

Java 通过不同的Y截距和X值绘制多元回归线,java,jfreechart,Java,Jfreechart,我试图通过一条线性回归线,通过共享相同斜率的单独数据簇。然而,尽管我已经成功地为点本身绘制了不同的颜色,并成功地绘制了这些颜色的图形,但我在线条上的尝试不起作用 早些时候,我尝试了一个hashset,它通过颜色调用集群,但这会导致行的输入顺序出现问题 在这次尝试中,我尝试通过一个数字附件链接集群,然后根据该附件调用线路 代码的第一部分并不是真正相关的,因为我没有在那里更改任何内容,并且该部分正在按预期工作。它从其他类调用,但由于问题不存在,我认为显示其他类与我当前的问题无关 我的代码的第二块是我

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

早些时候,我尝试了一个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) {
package集群;
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.Paint;
导入java.awt.geom.Rectangle2D;
导入java.io.IOException;
导入java.util.HashSet;
导入java.util.TreeSet;
导入org.jfree.chart.axis.NumberAxis;
导入org.jfree.chart.plot.CrosshairState;
导入org.jfree.chart.plot.FastScatterPlot;
导入org.jfree.chart.plot.PlotRenderingInfo;
导入org.jfree.ui.RectangleEdge;
公共类扩展FastScatterPlot扩展FastScatterPlot{
/**
*
*/
私有静态最终长serialVersionUID=1L;
int[]大小;
油漆[]颜色;
int[]形状;
公共扩展FastScatterPlot(float[][]数据、NumberAxis domainAxis、NumberAxis rangeAxis、int[]大小、,
绘制[]颜色,整型[]形状){
超级(数据、域轴、范围轴);
这个。尺寸=尺寸;
这个。颜色=颜色;
这个。形状=形状;
}
@凌驾
公共空心渲染(Graphics2D g2、矩形2D数据区、PlotRenderingInfo信息、CrosshairState CrosshairState){
//g2.setPaint(颜色为蓝色);
if(this.getData()!=null){
对于(int i=0;i
在下面的代码部分中,我尝试按编号为每个集群创建一行,在树集中,该行应模拟新的坡度线以供其运行。然而,出于某种原因,该代码似乎不存在。没有任何代码正在运行,我很好奇它是否与我可能放错位置的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");
        }
    }
}
for(int i=0;i=lineData.length)中断;
}   
}**
}捕获(IOE异常){
System.out.println(“无法打开数据文件”);
}
}
}
这是图表 如果没有a,很难说您当前的方法失败在哪里。下面的完整示例演示了该方法,该方法用于查找在
XYDataset
中估计序列的行的系数。表示估算值的第二个系列(如下蓝色所示)添加到
XYDataset

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

导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.util.Random;
导入javax.swing.JFrame;
导入org.jfree.chart.*;
导入org.jfree.chart.plot.PlotOrientation;
英普
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);
            }
        });
    }
}