2016-08-07 10 views
1

JFreeCharts를 사용하여 Java에서 산점도를 그립니다. PolynomialFunction2D를 사용하여 산점도 이상의 2 차 회귀 선을 그립니다.scatterplot에서 y의 함수로 2 차 곡선을 그립니다.

PolynomialFunction2D 즉 X의 함수로서 정의된다 차 곡선을 플롯 사용될 수

, Y = A0 + A1 * X + A2 * X^2 + ...

I가 플롯 할 계수가 주어질 때, JFreeCharts에서 만들어진 산점도의 x = a0 + a1 * y + a2 * y^2 + ...의 함수로서의 2 차 곡선.

이것이 가능합니까? 그리고, 그렇다면, 어떤 접근법이 동일한 접근법으로 사용될 수 있습니다.

답변

2

y 이상의 함수를 수동으로 샘플링하고 해당하는 x 값을 계산하여 함수에서 XYSeries을 만들 수 있습니다. 일례로서

FunctionOverScatter

: 생성 된 데이터 세트가 함께 산점도의 XYDataset 더불어 XYPlot에 첨가 될 수

import java.awt.Dimension; 

import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.data.function.Function2D; 
import org.jfree.data.function.PolynomialFunction2D; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 

public class FunctionOfYOverScatter 
{ 
    public static void main(String[] args) 
    { 
     new FunctionOfYOverScatter(); 
    } 

    public FunctionOfYOverScatter() 
    { 
     XYPlot plot = new XYPlot(); 

     XYDataset scatterPlotDataset = getScatterPlotDataset(); 
     plot.setDataset(0, scatterPlotDataset); 
     plot.setRenderer(0, new XYLineAndShapeRenderer(false, true)); 
     plot.setDomainAxis(0, new NumberAxis("Scatterplot domain")); 
     plot.setRangeAxis(0, new NumberAxis("Scatterplot range")); 
     plot.mapDatasetToDomainAxis(0, 0); 
     plot.mapDatasetToRangeAxis(0, 0); 

     double minY = -2.0; 
     double maxY = 2.0; 
     XYDataset functionDataset = 
      getFunctionDataset(0.8, 0.5, 1.2, minY, maxY); 
     plot.setDataset(1, functionDataset); 
     plot.setRenderer(1, new XYLineAndShapeRenderer(true, false)); 

     JFreeChart chart = new JFreeChart("Function of Y over scatter plot", 
      JFreeChart.DEFAULT_TITLE_FONT, plot, true); 
     ChartPanel chartPanel = new ChartPanel(chart); 
     chartPanel.setPreferredSize(new Dimension(500, 270)); 
     ApplicationFrame frame = new ApplicationFrame("Example"); 
     frame.setContentPane(chartPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private XYDataset getFunctionDataset(
     double a0, double a1, double a2, 
     double minY, double maxY) 
    { 
     double[] a = { a0, a1, a2 }; 
     Function2D p = new PolynomialFunction2D(a); 
     XYSeries series = sampleFunctionOverY(p, minY, maxY, 100, "Function"); 
     XYSeriesCollection dataset = new XYSeriesCollection(); 
     dataset.addSeries(series); 
     return dataset; 
    } 

    public static XYSeries sampleFunctionOverY(Function2D f, double start, 
     double end, int samples, Comparable<?> seriesKey) 
    { 
     XYSeries series = new XYSeries(seriesKey, false); 
     double step = (end - start)/(samples - 1); 
     for (int i = 0; i < samples; i++) 
     { 
      double y = start + step * i; 
      series.add(f.getValue(y), y); 
     } 
     return series; 
    } 


    private XYDataset getScatterPlotDataset() 
    { 
     XYSeriesCollection dataset = new XYSeriesCollection(); 
     XYSeries data = new XYSeries("Scatterplot"); 
     data.add(3.0, 2.0); 
     data.add(1.7, 1.0); 
     data.add(2.0, -1.0); 
     data.add(1.0, 1.8); 
     dataset.addSeries(data); 
     return dataset; 
    } 


} 
+1

관련 예는 [여기서 나타내었다 (HTTP//stackoverflow.com/a/20266619/230513), [here] (http://stackoverflow.com/a/20107935/230513) 및 [here] (http://stackoverflow.com/a/37716411/230513). – trashgod

+1

@trashgod 물론, 많은 예제가 있으며 질문의 요점이 정확히 무엇인지 알기는 어렵습니다. 1. 분산 형 및 선형 차트를 동일한 'ChartPanel'에 그리거나, (더 많은 가능성이있는) 함수를 생성합니다. y 값 이상. 후자에 대한 기본 제공 기능이 없으므로 이것이 주요 포인트였습니다. – Marco13

+1

좋은 점; 나는 미래의 방문객을 위해 몇 개의 빵 부스러기를 뿌리려고했다. – trashgod