Plotting multiple regression lines through different Y-Intercepts and X-values

后端 未结 1 1507
暗喜
暗喜 2020-12-04 03:13

I am trying to through a linear regression line through individual separate clusters of data that share the same slope. However, though I have successfully plotted differing

相关标签:
1条回答
  • 2020-12-04 04:16

    Absent a complete example, it's hard to say where your current approach fails. The complete example below illustrates the method Regression.getOLSRegression(), which uses ordinary least squares to find the coefficients of a line that estimates a series in an XYDataset. A second series representing the estimate, shown in blue below, is added to the XYDataset.

    You can compose more elaborate charts by adding multiple series to your dataset or using multiple renderers in your plot.

    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 讨论(0)
提交回复
热议问题