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<Double> equation = null;
 //设置多项式的次数
 int times = 2; 

 public FittingCurve(String title) {
 super(title);
 //使用最小二乘法计算拟合多项式中各项前的系数。
/*
请注意: 多项式曲线参数计算 与 Chart图表生成 是分开处理的。
多项式曲线参数计算: 负责计算多项式系数, 返回多项式系数List。
Chart图表生成: 仅仅负责按照给定的数据绘图。 比如对给定的点进行连线。
  本实例中,光滑的曲线是用密度很高的点连线绘制出来的。 由于我们计算出了多项式的系数,所以我们让X轴数据按照很小的步长增大,针对每一个X值,使用多项式计算出Y值, 从而得出点众多的(x,y)组。 把这些(x, y)组成的点连线绘制出来,则显示出光滑的曲线。
XYSeries为JFreeChart绘图数据集, 用于绘制一组有关系的数据。 XYSeries对应于X,Y坐标轴数据集, 添加数据方式为: XYSeries s.add(x,y);
XYSeriesCollection 为XYSeries的集合, 当需要在一个Chart上绘制多条曲线的时候,需要把多条曲线对应的XYSeries添加到XYSeriesCollection
 添加方法:dataset.addSeries(s1);
dataset.addSeries(s2);
*/
 //多项式的次数从高到低,该函数需要的参数:x轴数据<List>,y轴数据<List>,多项式的次数<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<data.get(0).size(); i++){
 s2.add(data.get(0).get(i),data.get(1).get(i));
 }
// 拟合曲线绘制 数据集 XYSeries s1 = new XYSeries("拟合曲线");
 //获取拟合多项式系数,equation在构造方法中已经实例化
 List<Double> list = this.equation;
 //获取预设的点数据
 List<List<Double>> data = this.getData(); 

 //get Max and Min of x;
 List<Double> 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<list.size(); j++){
 temp = temp + Math.pow(x, (num-j))*list.get(j);
 }
 s1.add(x, temp);
 } 

 //把预设数据集合拟合数据集添加到XYSeriesCollection
 XYSeriesCollection dataset = new XYSeriesCollection();
 dataset.addSeries(s1);
 dataset.addSeries(s2);
 return dataset; 

 }
 //模拟设置绘图数据(点)
 public List<List<Double>> getData(){
 //x为x轴坐标
 List<Double> x = new ArrayList<Double>();
 List<Double> y = new ArrayList<Double>();
 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<Double>> list = new ArrayList<List<Double>>();
 list.add(x);
 list.add(y);
 return list; 

 } 

//以下代码为最小二乘法计算多项式系数
//最小二乘法多项式拟合
 public List<Double> getCurveEquation(List<Double> x, List<Double> y, int m){
 if(x.size() != y.size() || x.size() <= m+1){
 return new ArrayList<Double>();
 }
 List<Double> result = new ArrayList<Double>();
 List<Double> S = new ArrayList<Double>();
 List<Double> T = new ArrayList<Double>();
 //计算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<y.size(); k++){
 ti = ti + y.get(k)*Math.pow(x.get(k), j);
 }
 T.add(ti);
 } 

 //把S和T 放入二维数组,作为矩阵
 double[][] matrix = new double[m+1][m+2];
 for(int k=0; k<m+1; k++){
 double[] matrixi = matrix[k];
 for(int q=0; q<m+1; q++){
 matrixi[q] = S.get(k+q);
 }
 matrixi[m+1] = T.get(k);
 }
 for(int p=0; p<matrix.length; p++){
 for(int pp=0; pp<matrix[p].length; pp++){
 System.out.print(" matrix["+p+"]["+pp+"]="+matrix[p][pp]);
 }
 System.out.println();
 }
 //把矩阵转化为三角矩阵
 matrix = this.matrixConvert(matrix);
 //计算多项式系数,多项式从高到低排列
 result = this.MatrixCalcu(matrix);
 return result;
 }
 //矩阵转换为三角矩阵
 public double[][] matrixConvert(double[][] d){
 for(int i=0; i<d.length-1; i++){
 double[] dd1 = d[i];
 double num1 = dd1[i]; 

 for(int j=i; j<d.length-1;j++ ){
 double[] dd2 = d[j+1];
 double num2 = dd2[i]; 

 for(int k=0; k<dd2.length; k++){
 dd2[k] = (dd2[k]*num1 - dd1[k]*num2);
 }
 }
 }
 for(int ii=0; ii<d.length; ii++){
 for(int kk=0; kk<d[ii].length; kk++)
 System.out.print(d[ii][kk]+" ");
 System.out.println();
 }
 return d;
 } 

 //计算一元多次方程前面的系数, 其排列为 xm xm-1 …… x0(多项式次数从高到低排列)
 public List<Double> MatrixCalcu(double[][] d){ 

 int i = d.length -1;
 int j = d[0].length -1;
 List<Double> list = new ArrayList<Double>();
 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<Double> data){
 double res = data.get(0);
 for(int i=0; i<data.size()-1; i++){
 if(res<data.get(i+1)){
 res = data.get(i+1);
 }
 }
 return res;
 }
 public double getMin(List<Double> data){
 double res = data.get(0);
 for(int i=0; i<data.size()-1; i++){
 if(res>data.get(i+1)){
 res = data.get(i+1);
 }
 }
 return res;
 } 

} 

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

(0)

相关推荐

  • JFreeChart实现实时曲线图

    最近要用到实时曲线图,在网上大概找了一下,有两种实现方式,一种就是JFreeChart的官方实例MemoryUsageDemo.java.通过一个实现java.Swing.Timer的内部类,在其监听器中将实时数据添加进TimeSeries,由于Timer是会实时执行的,所以这个方法倒是没有什么问题,可以参考代码. 另一种方式就是将实时类实现Runnable接口,在其run()方法中,通过无限循环将实时数据添加进TimeSeries,下面是较简单的实现代码: //RealTimeChart .j

  • jfreechart画折线图的方法

    JFreeChart 是开放源代码站点SourceForge.net 上的一个 JAVA 项目,它主要用来各种各样的图表,这些图表包括:饼图.柱状图 ( 普通柱状图以及堆栈柱状图 ).线图.区域图.分布图.混合图.甘特图以及一些仪表盘等等. 应用jfreechart来画图需要两个jar包:jfreechart.jar和jcommon.jar,下载地址. 下面是一个画折线图的例子: package yuth.jfree.demo; /** * 使用 categoryDataset 数据集创建折线图

  • JFreeChart动态画折线图的方法

    本文实例为大家分享了JFreeChart动态画折线图的具体代码,供大家参考,具体内容如下 每隔一秒画一次,一分钟后重新画 需要的jar包是:gnujaxp.jar,jcommon-1.0.16.jar,jfreechart-1.0.13.jar public class JFreeZheXianTest{ public static XYSeries xyCPUseries = new XYSeries("CPU"); public static int hundroud = 0; p

  • jfreechart插件将数据展示成饼状图、柱状图和折线图

    本文以展示柱状图为例进行介绍,当然这仅仅是一种方法而已:还有很多方法可以用于展示图表,例如自定义图表标签.使用jfreechart插件等: 1.导入js文件,包含了很多展示方法: 复制代码 代码如下: <script type="text/javascript" src=<select:link page="/js/ChartObject.js"/>></script> <script type="text/jav

  • JFreeChart折线图的生成方法

    JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计.JFreeChart可生成饼图(pie charts).柱状图(bar charts).散点图(scatter plots).时序图(time series).甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联. 折线图的实例 package com

  • JFreeChart插件实现的折线图效果实例

    本文实例讲述了JFreeChart插件实现的折线图效果.分享给大家供大家参考,具体如下: package com.lei.jfreechart; import javax.swing.JPanel; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; imp

  • 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; i

  • Android 贝塞尔曲线绘制一个波浪球

    目录 前言 一.绘制 backgroundColor 文本 二.构建 circlePath 三.绘制波浪线 四.取交集 五.绘制 foregroundColor 文本 六.添加动画 七.使用 前言 当 flutter 的现有组件无法满足产品要求的 UI 效果时,我们就需要通过自绘组件的方式来进行实现了.本篇文章就来介绍如何用 flutter 自定义实现一个带文本的波浪球,效果如下所示: 先来总结下 WaveLoadingWidget 的特点,这样才能归纳出实现该效果所需要的步骤: widget

  • Android 利用三阶贝塞尔曲线绘制运动轨迹的示例

    本篇文章主要介绍了Android 利用三阶贝塞尔曲线绘制运动轨迹的示例,分享给大家,具体如下: 实现点赞效果,自定义起始点以及运动轨迹 效果图: xml布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rl_root&

  • Qt自定义Plot实现曲线绘制的详细过程

    简介 实现了qt绘制曲线功能,包含arm触摸屏多点触控缩放(只支持两点),实时曲线绘制,数据点根据绘制宽度优化,跟踪点数据获取,双坐标等功能 演示 代码 头文件 plot.h /* * 作者:老人与海 * 博客:https://blog.csdn.net/qq_41340733 * 代码不保证稳定性,请勿用于商业用途 */ #ifndef PLOT_H #define PLOT_H #include <QWidget> #include <QTimer> #include <

  • Python中ROC曲线绘制

    首先以支持向量机模型为例 先导入需要使用的包,我们将使用roc_curve这个函数绘制ROC曲线! from sklearn.svm import SVC from sklearn.metrics import roc_curve from sklearn.datasets import make_blobs from sklearn. model_selection import train_test_split import matplotlib.pyplot as plt %matplot

  • C#实现chart控件动态曲线绘制

    本文实例为大家分享了C#实现chart控件动态曲线绘制的具体代码,供大家参考,具体内容如下 思想 实验室要做一个动态曲线绘制,网上方法很多,但是缺乏完整代码和效果图的整合,往往总是缺少其一,因此整理如下,方便大家编程,节约时间.思路:新建一个队列,利用timer控件,动态的往队列中加入数据,每次触发事件,就相当于将队列中的值全部重新画一遍. 我的目的是做四个点的动态监测,所以代码重复了四次,其实应该用4个线程来做,思路就显得较为清晰了,这也是可以改进的地方. public partial cla

  • python如何将多个模型的ROC曲线绘制在一张图(含图例)

    目录 多条ROC曲线绘制函数 绘制效果 调用格式与方法 详细解释和说明 1.关键函数 2.参数解释 需要注意的小小坑 补充 总结 多条ROC曲线绘制函数 def multi_models_roc(names, sampling_methods, colors, X_test, y_test, save=True, dpin=100): """ 将多个机器模型的roc图输出到一张图上 Args: names: list, 多个模型的名称 sampling_methods: li

  • Android利用贝塞尔曲线绘制动画的示例代码

    目录 彩虹系列 弹簧动画 复杂立体感动画 总结 前面我们花了几篇介绍了贝塞尔曲线的原理和绘制贝塞尔曲线,着实让我们见识到了贝塞尔曲线的美.好奇心驱使我想看看贝塞尔曲线动起来会是什么样?本篇就借由动画驱动贝塞尔曲线绘制看看动起来的贝塞尔曲线什么效果. 彩虹系列 通过动画控制绘制的结束点,就可以让贝塞尔曲线动起来.例如下面的动图展示的效果,看起来像搭了一个滑滑梯一样.实际上就是用7条贝塞尔曲线实现的,我们使用了 Animation 对象的值来控制绘制的结束点,从而实现了对应的动画效果. 具体源码如下

  • Android实现动态曲线绘制

    我们在安卓开发中,有时会用到统计图表的功能,而曲线绘制是其中比较典型的一种,一般是利用给定的坐标点集和安卓自带的绘图模块进行绘制,直接得到的是一张完整的静态的曲线图.但有时,我们需要动态绘制一些曲线图,就像我们打开电脑的任务管理器,里面有一个CPU使用记录的动态变化的带网格的曲线图,对于这一类的曲线绘制,安卓SDK自带的绘图模块貌似就不那么好用了. 在这里,我就利用Handler+timer机制和第三方开发包achartengine实现动态绘制安卓手机充放电曲线的应用. 1.下载第三方开发包ac

  • Python数据可视化之简单折线图的绘制

    目录 创建RandomWalk类 选择方向 绘制随机漫步图 模拟多次随机漫步 给点着色 突出起点和终点 增加点数 调整尺寸以适用屏幕 创建RandomWalk类 为模拟随机漫步,我们将创建一个RandomWalk类,随机选择前进方向,这个类有三个属性,一个存储随机漫步的次数,另外两个存储随机漫步的每个点的x,y坐标,每次漫步都从点(0,0)出发 from random import choice class RandomWalk(): '''一个生成随机漫步数据的类''' def __init_

随机推荐