栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JFreeChart简单实现光滑曲线绘制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JFreeChart简单实现光滑曲线绘制

用JFreeChart绘制光滑曲线,利用最小二乘法数学原理计算,供大家参考,具体内容如下

绘制图形:

 

代码:

FittingCurve.java

package org.jevy; 
import java.util.ArrayList; 
import java.util.List; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.Applicationframe; 
import org.jfree.ui.RefineryUtilities; 
public class FittingCurve extends Applicationframe{ 
 List equation = null; 
 //设置多项式的次数 
 int times = 2; 
 
 public FittingCurve(String title) { 
 super(title); 
 //使用最小二乘法计算拟合多项式中各项前的系数。 
 
 //多项式的次数从高到低,该函数需要的参数:x轴数据,y轴数据,多项式的次数<2> 
 this.equation = this.getCurveEquation(this.getData().get(0),this.getData().get(1),this.times); 
 
//生成Chart 
 JFreeChart chart = this.getChart(); 
 ChartPanel chartPanel = new ChartPanel(chart); 
 chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 
 chartPanel.setMouseZoomable(true, false); 
 setContentPane(chartPanel); 
 } 
 
 public static void main(String[] args) { 
 // TODO Auto-generated method stub 
 FittingCurve demo = new FittingCurve("XYFittingCurve"); 
 demo.pack(); 
 RefineryUtilities.centerframeonScreen(demo); 
 demo.setVisible(true); 
 
 } 
 
 //生成chart 
public JFreeChart getChart(){ 
 //获取X和Y轴数据集 
 XYDataset xydataset = this.getXYDataset(); 
 //创建用坐标表示的折线图 
 JFreeChart xyChart = ChartFactory.createXYLineChart( 
 "二次多项式拟合光滑曲线", "X轴", "Y轴", xydataset, PlotOrientation.VERTICAL, true, true, false); 
 //生成坐标点点的形状 
 XYPlot plot = (XYPlot) xyChart.getPlot(); 
 
 XYItemRenderer r = plot.getRenderer(); 
 if (r instanceof XYLineAndShapeRenderer) { 
  XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r; 
  renderer.setbaseShapesVisible(false);//坐标点的形状是否可见 
  renderer.setbaseShapesFilled(false); 
  } 
 ValueAxis yAxis = plot.getRangeAxis(); 
 yAxis.setLowerMargin(2); 
 return xyChart; 
 } 
 
//数据集按照逻辑关系添加到对应的集合 
 public XYDataset getXYDataset() { 
 //预设数据点数据集 
 XYSeries s2 = new XYSeries("点点连线"); 
 for(int i=0; i list = this.equation; 
 //获取预设的点数据 
 List> data = this.getData(); 
 
 //get Max and Min of x; 
 List xList = data.get(0); 
 double max =this.getMax(xList); 
 double min = this.getMin(xList); 
 double step = max - min; 
 double x = min; 
 double step2 = step/800.0; 
 //按照多项式的形式 还原多项式,并利用多项式计算给定x时y的值 
 for(int i=0; i<800; i++){ 
 x = x + step2; 
 int num = list.size()-1; 
 double temp = 0.0; 
 for(int j=0; j> getData(){ 
 //x为x轴坐标 
 List x = new ArrayList(); 
 List y = new ArrayList(); 
 for(int i=0; i<10; i++){ 
 x.add(-5.0+i); 
 } 
 y.add(26.0); 
 y.add(17.1); 
 y.add(10.01); 
 y.add(5.0); 
 y.add(2.01); 
 
 y.add(1.0); 
 
 y.add(2.0); 
 y.add(5.01); 
 y.add(10.1); 
 y.add(17.001); 
 
 List> list = new ArrayList>(); 
 list.add(x); 
 list.add(y); 
 return list; 
 
 } 
 
//以下代码为最小二乘法计算多项式系数 
//最小二乘法多项式拟合 
 public List getCurveEquation(List x, List y, int m){ 
 if(x.size() != y.size() || x.size() <= m+1){ 
 return new ArrayList(); 
 } 
 List result = new ArrayList(); 
 List S = new ArrayList(); 
 List T = new ArrayList(); 
 //计算S0 S1 …… S2m 
 for(int i=0; i<=2*m; i++){ 
 double si = 0.0; 
 for(double xx:x){ 
 si = si + Math.pow(xx, i); 
 } 
 S.add(si); 
 } 
 //计算T0 T1 …… Tm 
 for(int j=0; j<=m; j++){ 
 double ti = 0.0; 
 for(int k=0; k MatrixCalcu(double[][] d){ 
 
 int i = d.length -1; 
 int j = d[0].length -1; 
 List list = new ArrayList(); 
 double res = d[i][j]/d[i][j-1]; 
 list.add(res); 
 
 for(int k=i-1; k>=0; k--){ 
 double num = d[k][j]; 
 for(int q=j-1; q>k; q--){ 
 num = num - d[k][q]*list.get(j-1-q); 
 } 
 res = num/d[k][k]; 
 list.add(res); 
 } 
 return list; 
 } 
 
 //获取List中Double数据的最大最小值 
 public double getMax(List data){ 
 double res = data.get(0); 
 for(int i=0; i data){ 
 double res = data.get(0); 
 for(int i=0; idata.get(i+1)){ 
 res = data.get(i+1); 
 } 
 } 
 return res; 
 } 
 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/140658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号