Java 通过不同的Y截距和X值绘制多元回归线
我试图通过一条线性回归线,通过共享相同斜率的单独数据簇。然而,尽管我已经成功地为点本身绘制了不同的颜色,并成功地绘制了这些颜色的图形,但我在线条上的尝试不起作用 早些时候,我尝试了一个hashset,它通过颜色调用集群,但这会导致行的输入顺序出现问题 在这次尝试中,我尝试通过一个数字附件链接集群,然后根据该附件调用线路 代码的第一部分并不是真正相关的,因为我没有在那里更改任何内容,并且该部分正在按预期工作。它从其他类调用,但由于问题不存在,我认为显示其他类与我当前的问题无关 我的代码的第二块是我迷路的地方。为什么它看起来好像不是在编译?没有给出错误,它本质上只是一个幻影代码,好像我的if语句甚至不能初始化它 下面是可能不相关的第一个块。第二段代码是我更关心的问题。对不起,我是这些论坛的新手,我不完全确定提出问题的程序Java 通过不同的Y截距和X值绘制多元回归线,java,jfreechart,Java,Jfreechart,我试图通过一条线性回归线,通过共享相同斜率的单独数据簇。然而,尽管我已经成功地为点本身绘制了不同的颜色,并成功地绘制了这些颜色的图形,但我在线条上的尝试不起作用 早些时候,我尝试了一个hashset,它通过颜色调用集群,但这会导致行的输入顺序出现问题 在这次尝试中,我尝试通过一个数字附件链接集群,然后根据该附件调用线路 代码的第一部分并不是真正相关的,因为我没有在那里更改任何内容,并且该部分正在按预期工作。它从其他类调用,但由于问题不存在,我认为显示其他类与我当前的问题无关 我的代码的第二块是我
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);
}
});
}
}